Урок объясняет, что такое срезы в Go, как они связаны с массивами, как создавать срезы, выполнять операции slicing, расширять данные через append, предвыделять память с помощью make и работать с многомерными срезами.
Срезы - это гибкая, динамическая надстройка над массивами. Они позволяют работать с последовательностями данных без необходимости управлять фиксированным размером массива.
Срез - это «представление» (view) над массивом. Он содержит:
Особенности:
[]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
Используйте синтаксис 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]
Если вы знаете будущую вместимость:
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().