Senior
Pokud pracuji s řezem, vezmu ho jako parametr funkce, s něčím s ním udělám a po funkci s ním budu dále pracovat — na co si mám pamatovat? Jaké změny nebudou zvenčí viditelné?
sobes.tech AI
Odpověď od AI
V jazyce Go je řez (slice) struktura, která obsahuje ukazatel na pole, délku a kapacitu. Když předáte řez do funkce, kopíruje se pouze tato struktura (ukazatel, délka, kapacita), nikoli samotné pole.
Důležité věci na zapamatování:
- Změny v elementech řezu uvnitř funkce (například
s[0] = 10) budou viditelné zvenčí, protože ukazují na stejný pole. - Změny struktury řezu (například přiřazení nového řezu
s = append(s, 5)) neovlivní řez mimo funkci, protože se kopíruje pouze struktura.
Příklad:
func modify(s []int) {
s[0] = 100 // změní prvek pole — bude vidět zvenčí
s = append(s, 200) // změní lokální kopii řezu — zvenčí nebude vidět
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Vytiskne [100 2 3], přidání 200 se neprojeví
Shrnutí: Změny v elementech řezu jsou viditelné zvenčí, změny délky nebo kapacity (přes append, slices) ne, pokud nevrátíte nový řez nebo nepředáte ukazatel na řez.