Senior
Ak pracujem s rezom, vzamem ga kot parameter funkcije, nekaj z njim naredim in potem nadaljujem z delom z njim po funkciji — na kaj moram biti pozoren? Katere spremembe ne bomo videli od zunaj?
sobes.tech AI
Odpoveď od AI
V jazyku Go je rez (slice) štruktúra, ktorá obsahuje ukazovateľ na pole, dĺžku a kapacitu. Keď odovzdáte rez do funkcie, kopíruje sa iba táto štruktúra (ukazovateľ, dĺžka, kapacita), nie samotný poľ.
Dôležité veci na zapamätanie:
- Zmeny v prvkoch rezu vo vnútri funkcie (napríklad
s[0] = 10) budú viditeľné zvonku, pretože ukazujú na ten istý poľ. - Zmeny štruktúry rezu (napríklad priradenie nového rezu
s = append(s, 5)) nebudú mať vplyv na rez mimo funkcie, pretože sa kopíruje iba štruktúra.
Príklad:
func modify(s []int) {
s[0] = 100 // zmení prvok poľa — bude viditeľné zvonku
s = append(s, 200) // mení lokálnu kópiu rezu — zvonku nebude viditeľné
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Vytlačí [100 2 3], pridanie 200 sa neprejaví
Zhrnutie: Zmeny v prvkoch rezu sú viditeľné zvonku, ale zmeny dĺžky alebo kapacity (cez append, slices) nie, ak nevrátite nový rez alebo neodovzdáte ukazovateľ na rez.