Добавление элемента в слайс с превышением текущей ёмкости(Golang)

Не совсем понял, как под капотом работает слайс. Если мы добавляем в слайс ещё один элемент(сверх текущего capacity), то у нас создаётся новый массив из старого массива с добавлением нового элемента и при этом ёмкость нового массива будет равна ёмкости старого + 1?


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

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

Размер нового массива для хранения увеличенного числа элементов вычисляет функция nextslicecap(newLen, oldCap) из файла runtime/slice.go

Код делает следующее:

  • если newLen > 2*oldCap, то newCap = newLen
  • если oldCap < 256, то newCap = 2*oldCap
  • в остальных случаях newCap увеличивают с коэффициентом примерно 1.25 пока не станет newCap >= newLen

В вашем случае, когда слайс увеличивают на один элемент, то малые слайсы (до 256 байт) увеличивают в два раза, а остальные в 1.25 раз.

→ Ссылка