Sobes.tech
Назад к вопросам
Middle+
3

Расскажи о работе со слайсами в Go: как работают capacity и length, что будет при выходе за границы?

Компании, где спрашивали
Umbrella IT

Ответ от нейросети

sobes.tech AI

В Go слайс — это структура, которая содержит указатель на массив, длину (length) и ёмкость (capacity).

  • Length (len) — количество элементов, доступных в слайсе.
  • Capacity (cap) — максимальное количество элементов, которое слайс может вместить, начиная с текущего указателя.

Например, если у вас есть массив из 5 элементов, и слайс ссылается на первые 3, то len=3, cap=5.

При выходе за границы слайса (например, обращение к элементу с индексом >= len) происходит паника (runtime panic: index out of range). При этом выход за capacity невозможен напрямую, так как слайс не позволяет обращаться к элементам за пределами length.

Если вы расширяете слайс с помощью append и длина превышает capacity, Go автоматически выделит новый массив с увеличенной ёмкостью, скопирует данные и вернёт новый слайс.

Пример:

arr := [5]int{1, 2, 3, 4, 5}
s := arr[0:3] // len=3, cap=5
fmt.Println(len(s), cap(s)) // 3 5

// s[3] вызовет panic, так как индекс 3 >= len(s)
// но можно сделать s = s[:5], чтобы расширить длину до capacity
s = s[:5]
fmt.Println(s) // [1 2 3 4 5]

// append за пределы capacity создаст новый массив
s = append(s, 6) // новый массив, len=6, cap>=6