Sobes.tech
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.