Hol és hogyan valósul meg általában a szeletelés a memóriában a program futása közben?
sobes.tech MI
Válasz az MI-től
Go nyelvben a szelet (slice) egy olyan adatszerkezet, amely három mezőt tartalmaz: egy mutatót egy memóriahelyen lévő tömbre, a hosszát (len) és a kapacitását (cap). A program futása során a szelet a veremben (ha helyi) tárolódik, míg a mutatott tömb a halomban vagy a statikus memóriában helyezkedik el, a helyzettől függően.
Amikor egy szeletet hozunk létre, például s := make([]int, 5, 10), akkor egy 10 elemű tömböt foglalunk a halomban, és a szelet egy mutatót tartalmaz ennek a tömbnek a kezdetére, valamint egy hosszúságot 5 és egy kapacitást 10. A szeletet függvények között átadva csak a szelet struktúráját (3 mezőt) másoljuk, nem az egész tömböt, ez memóriahatékony.
Példa:
s := []int{1, 2, 3}
// s - struktúra, mutatóval az [1,2,3] tömbre, hossz=3, kap=3
func appendValue(slice []int, val int) []int {
return append(slice, val)
}
s = appendValue(s, 4)
Itt az append képes új tömböt foglalni, ha a kapacitás nem elegendő, és egy új szeletet ad vissza, mutatóval az új tömbre.