Ответ
Слайс в Go — это не сам массив данных, а дескриптор, описывающий непрерывный сегмент базового массива. В runtime он представлен внутренней структурой slice
из пакета runtime
.
Эта структура состоит из трех полей:
array
— указатель на первый элемент базового массива, к которому имеет доступ слайс. Тип этого поля —unsafe.Pointer
, что позволяет ему указывать на данные любого типа.len
— текущее количество элементов в слайсе (длина).cap
— максимальное количество элементов, которое может поместиться в слайс от его начала до конца базового массива (ёмкость).
Ключевой момент: При передаче слайса в функцию или присваивании его новой переменной копируется только эта структура-дескриптор, а не сам базовый массив. Поэтому изменения элементов слайса в одном месте будут видны в другом, так как оба слайса будут указывать на одну и ту же область памяти.
Пример: