Ak pošlete slice do funkcie a pridáte do neho nový prvok — budú zmeny viditeľné mimo funkcie? A ak kapacita nie je prekročená?
sobes.tech AI
Odpoveď od AI
V Go je rez (slice) štruktúra, ktorá obsahuje ukazovateľ na pole, dĺžku a kapacitu.
Ak odovzdáte rez do funkcie a pridáte do neho nový prvok pomocou append, správanie závisí od aktuálnej kapacity:
-
Ak kapacita nie je prekročená:
appendpridá prvok do existujúceho poľa, na ktoré ukazuje rez. V tomto prípade budú zmeny viditeľné mimo funkcie, pretože základné pole je zdieľané. -
Ak kapacita je prekročená:
appendvytvorí nové pole s väčšou kapacitou, skopíruje dáta a vráti nový rez. Vo vnútri funkcie bude nový rez, ale mimo funkcie zostane pôvodný rez nezmenený, pokiaľ nepriradíte výsledokappendspäť k rez.
Príklad:
func addElement(s []int) {
s = append(s, 10) // ak kapacita nie je prekročená, pridá do toho istého poľa
}
func main() {
s := make([]int, 0, 5) // kapacita 5
addElement(s)
fmt.Println(s) // [] — žiadne zmeny, pretože `append` vrátil nový rez, ktorý sme neuložili
s = append(s, 1, 2, 3)
s = append(s, 4) // kapacita nie je prekročená
addElement(s)
fmt.Println(s) // [1 2 3 4 10] — zmeny sú viditeľné
}
Zhrnutie: aby boli zmeny viditeľné mimo funkcie, musíte buď zabezpečiť, že kapacita nebude prekročená, alebo vrátiť a priradiť výsledok append späť k rez.