🍰 Срезы (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(). - Удобны для передачи в функции.
- Подходят для создания многомерных коллекций.