Sobes.tech
Middle

Какво се случва със слайс в Go, когато расте и достига лимита си на капацитет? Как работи логиката при добавяне на нови елементи?

sobes.tech AI

Отговор от AI

Когато един slice в Go достигне текущата си капацитет (capacity) и се опита да добави нов елемент чрез append, се случва преразпределение на памет:

  1. Създава се нов масив с увеличен капацитет. Обикновено новият capacity е около два пъти по-голям от стария, но точният алгоритъм зависи от реализацията и размера на slice.
  2. Съдържанието на стария масив се копира в новия.
  3. Новият елемент се добавя към новия масив.
  4. Slice започва да реферира към новия масив с актуализирана дължина и капацитет.

Това позволява на slice-овете да растат динамично, но операцията по добавяне може да бъде скъпа, ако се случи преразпределение.

Пример:

s := make([]int, 0, 2) // дължина 0, капацитет 2
s = append(s, 1, 2)     // сега дължина 2, капацитет 2
s = append(s, 3)        // капацитетът ще се увеличи, например до 4

По този начин, append автоматично управлява растежа на slice, скривайки детайлите по преразпределението от разработчика.