Перейти к содержанию

Слайсы (часть 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 массивы используют редко. На практике почти всегда слайс.

Объявление и запись

nums := []int{10, 20, 30}
fmt.Println(nums[0])   // 10
nums[1] = 99
fmt.Println(nums)      // [10 99 30]

Индексация с нуля. За границу выходить нельзя — будет паника.

len и cap

  • len(s) — сколько сейчас элементов в слайсе.
  • cap(s) — сколько помещается без аллокации новой памяти.
s := make([]int, 3, 5)   // длина 3, ёмкость 5
fmt.Println(len(s), cap(s))  // 3 5

Чаще всего тебе нужен только 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).