Sobes.tech
Junior — Middle

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.