Что представляет собой слайс в Go и на что указывает его внутренний указатель?

Ответ

Слайс (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 выделяет новый, больший массив, копирует туда старые данные и обновляет указатель слайса, чтобы он ссылался на этот новый массив. Старый массив будет удален сборщиком мусора, если на него не останется других ссылок.