Ответ
Слайс (slice) в Go — это не самостоятельная структура данных, а дескриптор, или "обертка", над сегментом базового массива (underlying array). Он предоставляет удобный и мощный интерфейс для работы с последовательностями данных.
Структура слайса (slice header) состоит из трех полей:
ptr
(указатель) — адрес первого элемента в базовом массиве, к которому у слайса есть доступ.len
(длина) — количество элементов в слайсе.cap
(ёмкость) — максимальное количество элементов, которое может поместиться в слайс, начиная от его стартового элемента и до конца базового массива.
Пример:
// Создаем массив и слайс, который на него ссылается
underlyingArray := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// s1 указывает на начало underlyingArray
s1 := underlyingArray[:5] // len=5, cap=10. Указатель -> &underlyingArray[0]
// s2 указывает на тот же массив, но со смещением
s2 := underlyingArray[2:7] // len=5, cap=8. Указатель -> &underlyingArray[2]
Когда вы добавляете элементы в слайс с помощью append
, и его len
превышает cap
, Go выделяет новый, больший массив, копирует туда старые данные и обновляет указатель слайса, чтобы он ссылался на этот новый массив. Старый массив будет удален сборщиком мусора, если на него не останется других ссылок.