Sobes.tech
Senior

Čo sa stane, ak odovzdáte slice ako argument funkcie a ho vo vnútri zmeníte?

sobes.tech AI

Odpoveď od AI

V jazyku Go saľo (slice) sa odovzdáva funkcii hodnotou, ale samotný saľo je štruktúra, ktorá obsahuje ukazovateľ na pole, dĺžku a kapacitu. Pri odovzdaní sa kopíruje práve táto štruktúra, nie údaje poľa.

Ak vo vnútri funkcie zmeníte prvky saľa (napríklad priradením nových hodnôt pomocou indexov), tieto zmeny budú viditeľné zvonku, pretože kópia saľa ukazuje na ten istý pole.

Avšak, ak zmeníte samotný saľo (napríklad jeho predĺžením pomocou append, čo môže alokovať nové pole), táto nová kópia s novým poľom nebude mať vplyv na saľo mimo funkcie.

Príklad:

func modifySlice(s []int) {
    s[0] = 100 // zmení prvý prvok pôvodného poľa
    s = append(s, 200) // vytvorí nový saľo, ale to zvonku nebude viditeľné
}

func main() {
    s := []int{1, 2, 3}
    modifySlice(s)
    fmt.Println(s) // Vypíše: [100 2 3]
}

Takže, zmeny prvkov saľa vo vnútri funkcie ovplyvnia pôvodné pole, ale zmeny samotného saľa (napríklad rozšírenie) — nie.