Sobes.tech
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.