Junior — Middle
Vždy sa pri rozšírení segmentu zdvojnásobí jeho veľkosť?
sobes.tech AI
Odpoveď od AI
Nie, zdvojnásobenie veľkosti rezu (slice) v Go pri rozširovaní sa nedá vždy očakávať.
Keď rez dosiahne svoju kapacitu a je potrebné pridať nový prvok, Go alokuje nový pole s navýšenou kapacitou a skopíruje dáta tam. Pravidlá pre zväčšenie kapacity závisia od aktuálnej veľkosti:
- Pre malé rezy (zvyčajne menej ako 1024 prvkov) sa veľkosť zvyčajne zdvojnásobí.
- Pre väčšie rezy je rast plynulejší, približne o 25 % aktuálnej kapacity.
Toto sa robí na optimalizáciu využitia pamäti a zníženie počtu kopírovaní pri veľkých rezoch.
Príklad:
s := make([]int, 0, 2) // kapacita 2
s = append(s, 1, 2) // teraz je dĺžka 2
s = append(s, 3) // kapacita sa pravdepodobne zvýši na 4 (zdvojnásobenie)
// Ak je rez veľmi veľký, napríklad s kapacitou 2000,
// pri rozširovaní sa kapacita zvýši približne na 2500 (nezdvojnásobí sa)
Preto je zdvojnásobenie častým, ale nie jediným scenárom rozširovania rezu.