Добавление элемента в слайс с превышением текущей ёмкости(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 раз.