Senior
Ha egy szelettel dolgozom, azt függvényparaméterként veszem, valamit csinálok vele, és a függvény után tovább dolgozom vele — mire kell emlékeznem? Milyen változásokat nem fogunk kívülről látni?
sobes.tech MI
Válasz az MI-től
Go nyelvben a szelet (slice) egy olyan struktúra, amely egy mutatót tartalmaz egy tömbre, egy hosszúságot és egy kapacitást. Amikor egy szeletet átadsz egy függvénynek, csak ez a struktúra (mutató, hossz, kapacitás) kerül másolásra, nem maga a tömb.
Fontos tudni:
- A szelet elemeinek módosítása a függvényen belül (pl.
s[0] = 10) kívülről is látható lesz, mivel ugyanarra a tömbre mutat. - A szelet struktúrájának módosítása (pl. új szelet hozzárendelése
s = append(s, 5)) nem befolyásolja a függvényen kívüli szeletet, mivel csak a struktúra másolódik.
Példa:
func modify(s []int) {
s[0] = 100 // módosítja a tömb elemet — kívülről látható
s = append(s, 200) // módosítja a helyi szelet másolatát — kívülről nem látható
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // [100 2 3] — a 200 hozzáadása nem tükröződik
Összefoglalva, a szelet elemeinek módosításai kívülről láthatók, de a hossz vagy kapacitás változtatásai (append, slices) nem, kivéve, ha új szeletet adunk vissza vagy mutatót adunk át a szelethez.