Middle
Какво се случва със слайс в Go, когато расте и достига лимита си на капацитет? Как работи логиката при добавяне на нови елементи?
sobes.tech AI
Отговор от AI
Когато един slice в Go достигне текущата си капацитет (capacity) и се опита да добави нов елемент чрез append, се случва преразпределение на памет:
- Създава се нов масив с увеличен капацитет. Обикновено новият capacity е около два пъти по-голям от стария, но точният алгоритъм зависи от реализацията и размера на slice.
- Съдържанието на стария масив се копира в новия.
- Новият елемент се добавя към новия масив.
- Slice започва да реферира към новия масив с актуализирана дължина и капацитет.
Това позволява на slice-овете да растат динамично, но операцията по добавяне може да бъде скъпа, ако се случи преразпределение.
Пример:
s := make([]int, 0, 2) // дължина 0, капацитет 2
s = append(s, 1, 2) // сега дължина 2, капацитет 2
s = append(s, 3) // капацитетът ще се увеличи, например до 4
По този начин, append автоматично управлява растежа на slice, скривайки детайлите по преразпределението от разработчика.