Sobes.tech
Назад к вопросам
Middle+
4

Как устроен slice в Go изнутри? Как работает функция append?

Компании, где спрашивали
Ozon ФинтехOzon Финтех

Ответ от нейросети

sobes.tech AI

В Go срез (slice) — это структура, которая содержит три поля:

  • указатель на массив (указатель на первый элемент среза или на начало выделенного массива);
  • длина (len) — количество элементов, доступных в срезе;
  • ёмкость (cap) — максимальное количество элементов, которые можно хранить в массиве, начиная с указателя.

Таким образом, срез — это не массив, а «окно» на часть массива.

Функция append добавляет элементы в срез. Если длина среза меньше ёмкости, append просто записывает новые элементы в существующий массив и увеличивает длину среза. Если же длина достигла ёмкости, происходит выделение нового массива с увеличенной ёмкостью (обычно в 2 раза больше), копирование старых данных и добавление новых элементов туда. Возвращается новый срез, указывающий на новый массив.

Пример:

s := make([]int, 0, 3) // длина 0, ёмкость 3
s = append(s, 1, 2)    // добавляем 2 элемента, длина 2, ёмкость 3
s = append(s, 3)       // длина 3, ёмкость 3
s = append(s, 4)       // превышена ёмкость, выделяется новый массив с большей ёмкостью

Таким образом, append обеспечивает динамическое расширение среза с управлением памятью под капотом.