Слайсы (часть 1)¶
Слайс — это динамический список значений одного типа. Самая частая структура данных в Go. На этой странице — только база, без подводных камней с общим backing array. Это будет в части 2.
Что должен понять¶
- Чем массив отличается от слайса.
- Как объявить, прочитать и записать элемент.
- Что делает
len,capиappend. - Когда использовать
make([]T, n).
Массив vs слайс¶
var arr [3]int = [3]int{1, 2, 3} // массив, длина зашита в тип
var sl []int = []int{1, 2, 3} // слайс, длина гибкая
В Go массивы используют редко. На практике почти всегда слайс.
Объявление и запись¶
Индексация с нуля. За границу выходить нельзя — будет паника.
len и cap¶
len(s)— сколько сейчас элементов в слайсе.cap(s)— сколько помещается без аллокации новой памяти.
Чаще всего тебе нужен только len. cap — для оптимизации.
append¶
append добавляет в конец и возвращает (возможно новый) слайс. Всегда
присваивай результат обратно:
nums := []int{1, 2}
nums = append(nums, 3)
nums = append(nums, 4, 5)
fmt.Println(nums) // [1 2 3 4 5]
make vs литерал¶
a := []int{} // пустой слайс длиной 0
b := make([]int, 0) // тоже пустой
c := make([]int, 5) // пять нулей: [0 0 0 0 0]
d := make([]int, 0, 100) // пустой, но с заранее выделенной ёмкостью
Если знаешь, сколько элементов добавишь — используй make([]T, 0, N),
это быстрее.
Типичные ошибки¶
nums = append(nums, x)забыли присвоить — изменения теряются.- Думают, что
make([]int, 5)— это пустой слайс. На самом деле там пять нулей. Для пустого с резервом нуженmake([]int, 0, 5). - Пишут
nums[10] = 1без проверкиlen. Будет паника.
Критерии приёмки модуля¶
- Программа создаёт слайс, добавляет 5 элементов через
append. - Программа печатает сумму элементов слайса.
- Программа находит максимум через for-range.
- В коде нет выходов за границу.
Дальше: Слайсы (часть 2).