Sobes.tech
Middle

Cik lielu palielinās slices izmērs, izmantojot funkciju append?

sobes.tech AI

Atbilde no AI

Slice izmērs var pieaugēt dažādos veidos, atkarībā no pašreizējās ietilpības cap(slice):

  1. Ja ietilpība nav pietiekama: Jaunā ietilpība būs vismaz divreiz lielāka par pašreizējo, ja tā ir mazāka par 1024. Ja tā ir lielāka par 1024, ietilpība palielināsies aptuveni par 25% no pašreizējās, līdz tā kļūst pietiekama. Tad tā var tikt pielāgota uz augšu.
  2. Ja ietilpība ir pietiekama: Slice garums precīzi palielināsies par pievienoto elementu skaitu, un ietilpība nemainīsies.
// Piemērs append uzvedībai, ja nav pietiekamas ietilpības
s := make([]int, 0, 0) // izmērs 0, ietilpība 0
s = append(s, 1)       // izmērs 1, ietilpība 1. (0 -> 1)
s = append(s, 2)       // izmērs 2, ietilpība 2. (1 -> 2)
s = append(s, 3)       // izmērs 3, ietilpība 4. (2 -> 4)
s = append(s, 4)       // izmērs 4, ietilpība 4
s = append(s, 5)       // izmērs 5, ietilpība 8. (4 -> 8)

s2 := make([]int, 0, 1025) // izmērs 0, ietilpība 1025
s2 = append(s2, make([]int, 500)...) // izmērs 500, ietilpība 1025 (pietiekami)
s2 = append(s2, make([]int, 1000)...) // izmērs 1500, aptuveni 1025 + 1025*0.25 + epsilon

Specifiska algoritma ietilpības palielināšanai atrodas runtime iekšienē un var mainīties starp Go versijām. Tomēr kopējās noteikumi (divkāršošana līdz 1024, palielināšana par aptuveni 25% pēc tam) paliek spēkā.