Sobes.tech
Middle

Kiek padidėja slice dydis naudojant funkciją append?

sobes.tech AI

Atsakymas iš AI

Slišo dydis gali didėti įvairiais būdais, priklausomai nuo dabartinio pajėgumo cap(slice):

  1. Jei pajėgumas nėra pakankamas: Naujas pajėgumas bus bent dvigubai didesnis už dabartinį, jei jis yra mažesnis nei 1024. Jei jis yra didesnis nei 1024, pajėgumas didės maždaug 25% nuo dabartinio, kol taps pakankamas. Tada jis gali būti pakoreguotas aukštyn.
  2. Jei pajėgumas yra pakankamas: Slišo dydis tiksliai padidės pagal pridėtus elementus, o pajėgumas nesikeis.
// Pavyzdys, kaip elgiasi append, kai nėra pakankamai pajėgumo
s := make([]int, 0, 0) // dydis 0, pajėgumas 0
s = append(s, 1)       // dydis 1, pajėgumas 1. (0 -> 1)
s = append(s, 2)       // dydis 2, pajėgumas 2. (1 -> 2)
s = append(s, 3)       // dydis 3, pajėgumas 4. (2 -> 4)
s = append(s, 4)       // dydis 4, pajėgumas 4
s = append(s, 5)       // dydis 5, pajėgumas 8. (4 -> 8)

s2 := make([]int, 0, 1025) // dydis 0, pajėgumas 1025
s2 = append(s2, make([]int, 500)...) // dydis 500, pajėgumas 1025 (pakankamas)
s2 = append(s2, make([]int, 1000)...) // dydis 1500, maždaug 1025 + 1025*0.25 + epsilon

Konkreti pajėgumo didinimo algoritmas yra runtime viduje ir gali skirtis tarp Go versijų. Tačiau bendrosios taisyklės (dvigubinti iki 1024, po to didinti apie 25%) lieka galioti.