Junior — Middle
Milyen adatok vannak a slice-on belül, amelyeket átadnak a függvény hívásakor ezzel a slice-szel argumentumként?
sobes.tech MI
Válasz az MI-től
Go-ban a szelet egy olyan szerkezet, amely három mezőt tartalmaz: egy mutatót egy tömbre, egy hosszúságot és egy kapacitást. Amikor egy szeletet egy függvénynek adunk át, csak ezt a szerkezetet másoljuk, nem az egész adat tömböt.
Vagyis, amikor egy függvényt hívunk, a szelet érték szerint kerül átadásra, de csak a metaadatokat (mutató, hosszúság, kapacitás) másoljuk, nem a tömb elemeit. Ez azt jelenti, hogy a függvényen belül a szelet ugyanarra az alap tömbre mutat, és a szelet elemeiben végrehajtott változtatások kívülről is láthatók lesznek.
Példa:
func modify(slice []int) {
slice[0] = 100 // az első elemet módosítjuk
}
func main() {
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // [100 2 3] kiírja
}
Ezért, amikor egy szeletet átadunk egy függvénynek, csak a szelet szerkezetének három mezője másolódik, de a tömb adatai megosztottak maradnak.