Sobes.tech
Middle+

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á: append pridá 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á: append vytvorí 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ýsledok append späť 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.