Назад к урокам

Срезы (Slices) в Go

Урок объясняет, что такое срезы в Go, как они связаны с массивами, как создавать срезы, выполнять операции slicing, расширять данные через append, предвыделять память с помощью make и работать с многомерными срезами.

Начинающий10 min

🍰 Срезы (Slices) в Go

Срезы - это гибкая, динамическая надстройка над массивами. Они позволяют работать с последовательностями данных без необходимости управлять фиксированным размером массива.


📌 Что такое срез?

Срез - это «представление» (view) над массивом. Он содержит:

  • указатель на массив,
  • длину (length),
  • вместимость (capacity).

Особенности:

  • размер среза может меняться,
  • можно работать с любым массивом через срез,
  • функции часто принимают параметры типа []T.

🛠 Создание срезов

Срезы можно создавать одновременно с массивом:

numbers := [...]int{1, 2, 3, 4}
slice1 := numbers[:] // весь массив
slice2 := numbers[1:] // от индекса 1 до конца
slice3 := numbers[:2] // с начала до индекса 2 (не включительно)
slice4 := numbers[1:3] // элементы 1 и 2

Срезы можно создавать и без массива - через литералы:

s := []int{10, 20, 30}

🔍 Доступ к элементам

Как и в массивах:

s := []int{7, 8, 9}
item := s[0] // 7

🔪 Операции срезания (slicing)

Используйте синтаксис slice[a:b], где:

  • a - начало (включительно),
  • b - конец (не включительно).

Примеры:

numbers := []int{1, 2, 3, 4}

slice1 := numbers[:]   // [1, 2, 3, 4]
slice2 := numbers[1:]  // [2, 3, 4]
slice3 := numbers[:2]  // [1, 2]
slice4 := numbers[1:3] // [2, 3]

❗ Ошибка: выход за пределы массива/среза вызывает panic.


➕ Динамическое расширение

Срезы можно расширять:

Через append():

numbers := []int{1, 2, 3}
numbers = append(numbers, 4, 5, 6)
// [1, 2, 3, 4, 5, 6]

Объединение двух срезов:

part1 := []int{1, 2, 3}
part2 := []int{4, 5, 6}

combined := append(part1, part2...)
// [1, 2, 3, 4, 5, 6]

🧱 Предвыделение памяти (make)

Если вы знаете будущую вместимость:

s := make([]int, 0, 100)

Преимущества: - меньше перераспределений памяти, - выше производительность.


🧭 Срезы в функциях

Функции могут принимать срез любого размера:

func iterate(s []int) {
    for i := 0; i < len(s); i++ {
        // ...
    }
}

iterate([]int{1})
iterate([]int{1, 2, 3, 4, 5})

🧩 Многомерные срезы

Срезы можно вкладывать друг в друга:

board := [][]string{
    {"_", "_", "_"},
    {"_", "_", "_"},
    {"_", "_", "_"},
}

board[0][0] = "X"
board[2][2] = "O"

📘 Итоги

  • Срезы - динамические последовательности, построенные поверх массивов.
  • Работают через синтаксис slice[a:b].
  • Можно расширять с помощью append().
  • Переменную память можно предвыделить через make().
  • Удобны для передачи в функции.
  • Подходят для создания многомерных коллекций.