Этот вопрос проверяет понимание внутренней реализации слайсов в Go и поведения при увеличении их емкости.
Когда в слайс добавляется элемент и текущей capacity недостаточно, Go выделяет новый массив с большей емкостью. До capacity 1024 размер удваивается, после этого рост становится линейным (примерно +25%). Это позволяет эффективно управлять памятью и снижать количество аллокаций.
Механизм увеличения capacity слайса (slice) в Go основан на адаптивной стратегии роста, чтобы сбалансировать производительность и потребление памяти.
Добавление элемента (append):
Если в слайсе хватает capacity, элемент просто добавляется.
Если capacity не хватает — создаётся новый массив, и все данные копируются.
Правило увеличения:
Пока capacity < 1024, размер нового массива удваивается (cap * 2).
Когда capacity >= 1024, прирост составляет примерно 25% (т.е. cap = cap + cap/4).
s := make([]int, 0, 1)
for i := 0; i < 10; i++ {
fmt.Printf("len=%d cap=%d\n", len(s), cap(s))
s = append(s, i)
}Результат:
len=1 cap=1
len=2 cap=2
len=3 cap=4
len=4 cap=4
len=5 cap=8
...Меньше аллокаций: увеличение capacity снижает частоту выделения памяти.
Контроль над производительностью: можно предварительно задать нужный capacity, если известно количество элементов.
Вывод:
Стоит учитывать алгоритм роста capacity при работе с большими массивами. Для оптимальной производительности лучше заранее указывать capacity, если известно количество элементов.