Sobes.tech
Middle

O koľko sa zväčší veľkosť slice pri použití funkcie append?

sobes.tech AI

Odpoveď od AI

Veľkosť slice sa môže zväčšovať rôznymi spôsobmi v závislosti od aktuálnej kapacity cap(slice):

  1. Ak kapacita nie je dostatočná: Nová kapacita bude minimálne dvojnásobkom aktuálnej, ak je menšia ako 1024. Ak je väčšia ako 1024, kapacita sa bude zvyšovať približne o 25 % aktuálnej kapacity, kým nebude dostatočná. Potom môže byť upravená smerom nahor.
  2. Ak je kapacita dostatočná: Veľkosť slice sa presne zväčší o počet pridaných prvkov a kapacita zostane nezmenená.
// Príklad správania append pri nedostatku kapacity
s := make([]int, 0, 0) // veľkosť 0, kapacita 0
s = append(s, 1)       // veľkosť 1, kapacita 1. (0 -> 1)
s = append(s, 2)       // veľkosť 2, kapacita 2. (1 -> 2)
s = append(s, 3)       // veľkosť 3, kapacita 4. (2 -> 4)
s = append(s, 4)       // veľkosť 4, kapacita 4
s = append(s, 5)       // veľkosť 5, kapacita 8. (4 -> 8)

s2 := make([]int, 0, 1025) // veľkosť 0, kapacita 1025
s2 = append(s2, make([]int, 500)...) // veľkosť 500, kapacita 1025 (dostatočná)
s2 = append(s2, make([]int, 1000)...) // veľkosť 1500, približne 1025 + 1025*0.25 + epsilon

Konkrétny algoritmus pre zväčšovanie kapacity je vo vnútri runtime a môže sa líšiť medzi verziami Go. Avšak, všeobecné pravidlá (zdvojnásobenie do 1024, zvýšenie o približne 25 % po tom) zostávajú platné.