Back to questions
Ozon Финтех
Middle+
5
Как устроен slice в Go изнутри? Как работает функция append?
Companies where asked
Answer from AI
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 обеспечивает динамическое расширение среза с управлением памятью под капотом.