Senior
Čo je to slice? Čo je pod kapotou slice-a? Ako funguje funkcia append?
sobes.tech AI
Odpoveď od AI
V Go je rez (slice) dynamický poľ, ktorý predstavuje štruktúru so tromi poľami:
- Ukazovateľ na poľ (podkladové pole v pamäti)
- Dĺžka (len) — počet prvkov dostupných v reze
- Kapacita (cap) — maximálny počet prvkov, ktoré môže podkladové pole od ukazovateľa obsahovať
V pozadí je rez malou štruktúrou, približne takto:
type sliceHeader struct {
Data uintptr // ukazovateľ na prvý prvok poľa
Len int
Cap int
}
Funkcia append pridáva prvky do rezu. Ak je dĺžka rezu menšia ako kapacita, append jednoducho zapíše nové prvky do podkladového poľa a zvýši dĺžku. Ak dĺžka dosiahne kapacitu, append alokuje nový poľ s väčšou kapacitou (zvyčajne dvojnásobnou), skopíruje staré prvky, pridá nové a vráti nový rez s aktualizovaným ukazovateľom.
Príklad:
s := []int{1, 2, 3}
s = append(s, 4) // ak cap(s) > len(s), jednoducho pridá 4
// ak cap(s) == len(s), alokuje nový poľ, skopíruje [1,2,3], pridá 4
Týmto spôsobom môže append vrátiť nový rez, a je dôležité priradiť výsledok znova.