Sobes.tech
Middle+

Kedy sa inicializovaná hodnota premennej odovzdá operátoru defer a ako je to spojené s pomenovaním funkcie?

sobes.tech AI

Odpoveď od AI

V jazyku Go sa argumenty funkcie, vrátane tých, ktoré sa používajú v príkaze defer, vyhodnocujú v momente volania defer, nie v momente skutočného vykonania odloženej funkcie.

To znamená, že ak je premenná odovzdaná defer, jej hodnota je fixovaná okamžite pri deklarácii defer, aj keď odložená funkcia bude neskôr vykonaná, napríklad po opustení funkcie.

Príklad:

func priklad() (vysledok int) {
    x := 5
    defer fmt.Println("defer x:", x) // x je tu fixované, je 5
    x = 10
    return x
}

Pri volaní priklad(), výstup bude "defer x: 5", hoci v momente návratu je x už 10.

Čo sa týka pomenovaných návratových hodnôt, defer ich môže meniť, ak k nim odložená funkcia má priamy prístup:

func priklad() (vysledok int) {
    defer func() {
        vysledok += 1 // meníme pomenovaný výsledok
    }()
    vysledok = 5
    return // vráti 6 po vykonaní defer
}

Takže, defer fixuje hodnoty argumentov pri deklarácii, ale môže ovplyvniť pomenované návratové hodnoty, ak sú v rámci odloženej funkcie zmenené.