Sobes.tech
Middle+

Mikor kerül az inicializált változó értéke a defer operátorhoz, és hogyan kapcsolódik ez a függvény nevéhez?

sobes.tech MI

Válasz az MI-től

Go nyelvben a függvény argumentumai, beleértve azokat is, amelyeket a defer utasításban használnak, a defer hívásakor értékelődnek ki, nem pedig a késleltetett függvény tényleges végrehajtásakor.

Ez azt jelenti, hogy ha egy változót átadunk defer-nek, akkor az értéke az defer deklarálásakor rögzül, még akkor is, ha a késleltetett függvény később, például a függvény kilépése után fut le.

Példa:

func pelda() (eredmeny int) {
    x := 5
    defer fmt.Println("defer x:", x) // x itt rögzül, értéke 5
    x = 10
    return x
}

A pelda() hívásakor a kimenet "defer x: 5" lesz, pedig a visszatérés pillanatában az x már 10.

A névvel ellátott visszatérési értékek esetében a defer módosíthatja azokat, ha a késleltetett függvény közvetlenül hozzáfér azokhoz:

func pelda() (eredmeny int) {
    defer func() {
        eredmeny += 1 // a névvel ellátott eredményt módosítjuk
    }()
    eredmeny = 5
    return // 6-ot ad vissza a defer végrehajtása után
}

Így a defer rögzíti az argumentumok értékeit a deklaráció pillanatában, de befolyásolhatja a névvel ellátott visszatérési értékeket, ha azokat a késleltetett függvényben módosítják.