Sobes.tech
Senior

Co je to slice? Co je pod kapotou slice? Jak funguje funkce append?

sobes.tech AI

Odpověď od AI

V Go je řez (slice) dynamický pole, které představuje strukturu se třemi poli:

  • Ukazatel na pole (podkladové pole v paměti)
  • Délka (len) — počet prvků dostupných v řezu
  • Kapacita (cap) — maximální počet prvků, které může podkladové pole od ukazatele obsahovat

V pozadí je řez malou strukturou, přibližně takto:

type sliceHeader struct {
    Data uintptr // ukazatel na první prvek pole
    Len  int
    Cap  int
}

Funkce append přidává prvky do řezu. Pokud je délka řezu menší než kapacita, append jednoduše zapíše nové prvky do podkladového pole a zvětší délku. Pokud délka dosáhne kapacity, append alokuje nové pole s větší kapacitou (obvykle dvojnásobnou), zkopíruje staré prvky, přidá nové a vrátí nový řez s aktualizovaným ukazatelem.

Příklad:

s := []int{1, 2, 3}
s = append(s, 4) // pokud cap(s) > len(s), jednoduše přidá 4

// pokud cap(s) == len(s), alokuje nové pole, zkopíruje [1,2,3], přidá 4

Tímto způsobem může append vrátit nový řez, a je důležité přiřadit výsledek zpět.