Senior
Mi az a slice? Mi van a slice motorházteteje alatt? Hogyan működik az append függvény?
sobes.tech MI
Válasz az MI-től
Go-ban a szelet egy dinamikus tömb, amely három mezővel rendelkező struktúrát képvisel:
- Mutató a tömbre (alap tömb a memóriában)
- Hossz (len) — a szeletben elérhető elemek száma
- Kapacitás (cap) — a mutatótól kezdve az alap tömb maximális elemek száma
A háttérben a szelet egy kis struktúra, nagyjából így:
type sliceHeader struct {
Data uintptr // mutató az első elemre a tömbben
Len int
Cap int
}
Az append függvény elemeket ad hozzá a szelethez. Ha a szelet hossza kisebb, mint a kapacitás, az append egyszerűen írja az új elemeket az alatta lévő tömbbe, és növeli a hosszát. Ha a hossz eléri a kapacitást, az append új tömböt foglal le megnövelt kapacitással (általában kétszeres), másolja a régi elemeket, hozzáadja az újat, és egy frissített mutatóval új szeletet ad vissza.
Példa:
s := []int{1, 2, 3}
s = append(s, 4) // ha cap(s) > len(s), egyszerűen hozzáadja a 4-et
// ha cap(s) == len(s), új tömböt foglal, másolja [1,2,3], hozzáadja a 4-et
Így az append visszaadhat egy új szeletet, és fontos, hogy az eredményt újra hozzárendeljük.