Назад к вопросам
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