Golang Как срез получает следующий элемент массива если он хранит ссылку только на первый?

Не совсем понимаю, везде написано, что срезы хранят ссылку именно на первый элемент массива, но как тогда он может получить значение второго элемента и т.д.?


Ответы (2 шт):

Автор решения: Pak Uula

Срез внутри устроен как структура данных из трёх полей:

  • Data указатель на данные,
  • Len число элементов,
  • Cap максимальное количество элементов, которые может вместить срез без переаллокации.

Элементы хранятся в срезе один за другим, без просветов. Поэтому найти второй элемент среза типа []T совсем несложно:

  • убедиться, что в срезе есть второй элемент: Len > 1
  • прибавить размер T к указателю Data - так получен указатель на второй элемент
  • вернуть объект, который лежит по полученному указателю.

Размер типа T знает компилятор.

→ Ссылка
Автор решения: Willam

Спецификация типа для среза - это []T, где T - тип элементов среза. В отличие от типа массива, тип среза не имеет заданной длины. Нулевое значение среза равно nil. Для добавления элемента необходимо прибавить []T к (указатель) Data. Следовательно мы можем узнать о любых других элементах среза.

→ Ссылка