Как устроен слайс (slice) в Go на уровне runtime?

Ответ

Слайс в Go — это не сам массив данных, а дескриптор, описывающий непрерывный сегмент базового массива. В runtime он представлен внутренней структурой slice из пакета runtime.

Эта структура состоит из трех полей:

  • array — указатель на первый элемент базового массива, к которому имеет доступ слайс. Тип этого поля — unsafe.Pointer, что позволяет ему указывать на данные любого типа.
  • len — текущее количество элементов в слайсе (длина).
  • cap — максимальное количество элементов, которое может поместиться в слайс от его начала до конца базового массива (ёмкость).

Ключевой момент: При передаче слайса в функцию или присваивании его новой переменной копируется только эта структура-дескриптор, а не сам базовый массив. Поэтому изменения элементов слайса в одном месте будут видны в другом, так как оба слайса будут указывать на одну и ту же область памяти.

Пример: