Sobes.tech
Middle

O kolik se zvětší velikost slice při použití funkce append?

sobes.tech AI

Odpověď od AI

Velikost slice se může zvětšovat různými způsoby v závislosti na aktuální kapacitě cap(slice):

  1. Pokud kapacita není dostatečná: Nová kapacita bude minimálně dvojnásobkem aktuální kapacity, pokud je menší než 1024. Pokud je větší než 1024, kapacita se zvýší přibližně o 25 % aktuální kapacity, dokud nebude dostatečná. Poté může být upravena směrem nahoru.
  2. Pokud je kapacita dostatečná: Velikost slice se přesně zvětší o počet přidaných prvků a kapacita zůstane nezměněna.
// Příklad chování append při nedostatku kapacity
s := make([]int, 0, 0) // velikost 0, kapacita 0
s = append(s, 1)       // velikost 1, kapacita 1. (0 -> 1)
s = append(s, 2)       // velikost 2, kapacita 2. (1 -> 2)
s = append(s, 3)       // velikost 3, kapacita 4. (2 -> 4)
s = append(s, 4)       // velikost 4, kapacita 4
s = append(s, 5)       // velikost 5, kapacita 8. (4 -> 8)

s2 := make([]int, 0, 1025) // velikost 0, kapacita 1025
s2 = append(s2, make([]int, 500)...) // velikost 500, kapacita 1025 (dostatečná)
s2 = append(s2, make([]int, 1000)...) // velikost 1500, přibližně 1025 + 1025*0.25 + epsilon

Konkrétní algoritmus růstu kapacity je uvnitř runtime a může se lišit mezi verzemi Go. Obecně však platí pravidla (zdvojení do 1024, zvýšení o přibližně 25 % po té).