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