Sobes.tech
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.