Что случится, если выполнить операцию append для среза, у которого закончилась выделенная память?

Если у среза (slice) в Go заканчивается выделённая емкость (capacity) при вызове функции append, то происходит выделение нового массива с увеличенной емкостью.

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Пример:

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

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

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее