Sobes.tech
Middle

Mennyivel nő a szelet mérete az append függvény használatakor?

sobes.tech MI

Válasz az MI-től

A szelet mérete különböző módon növekedhet, attól függően, hogy mi a jelenlegi kapacitás cap(slice):

  1. Ha a kapacitás nem elegendő: Az új kapacitás legalább kétszerese lesz a jelenlegi kapacitásnak, ha az kisebb 1024-nél. Ha nagyobb, akkor a kapacitás körülbelül 25%-kal növekszik a jelenlegi kapacitásból, amíg elég nem lesz. Ezután felfelé igazítható.
  2. Ha a kapacitás elegendő: A szelet mérete pontosan a hozzáadott elemek számával növekszik, és a kapacitás nem változik.
// Példa a append viselkedésére, ha nincs elég kapacitás
s := make([]int, 0, 0) // méret 0, kapacitás 0
s = append(s, 1)       // méret 1, kapacitás 1. (0 -> 1)
s = append(s, 2)       // méret 2, kapacitás 2. (1 -> 2)
s = append(s, 3)       // méret 3, kapacitás 4. (2 -> 4)
s = append(s, 4)       // méret 4, kapacitás 4
s = append(s, 5)       // méret 5, kapacitás 8. (4 -> 8)

s2 := make([]int, 0, 1025) // méret 0, kapacitás 1025
s2 = append(s2, make([]int, 500)...) // méret 500, kapacitás 1025 (elég)
s2 = append(s2, make([]int, 1000)...) // méret 1500, körülbelül 1025 + 1025*0.25 + epsilon

A kapacitás növelésének konkrét algoritmusa a runtime-ban található, és változhat a Go verziók között. Azonban az általános szabályok (duplázás 1024-ig, kb. 25%-os növekedés utána) megmaradnak.