Sobes.tech
Junior — Middle

Mi az eredménye annak, ha egy változónak értéket adunk a defer szerkezet használatával, amikor az értékét egy függvényen belül állítjuk be?

sobes.tech MI

Válasz az MI-től

Go nyelvben a defer kulcsszó késlelteti egy függvény végrehajtását a körülötte lévő függvény kilépéséig. A defer-hez átadott függvény argumentumai azonnal értékelődnek ki a defer deklarálásakor, nem a végrehajtáskor.

Ha egy változót a defer-rel hívott függvényen belül használunk, akkor a változó értéke az lesz, ami a defer deklarálásának pillanatában volt, ha argumentumként adtuk át. Ha a változót közvetlenül használjuk (például lezárás révén), akkor a végrehajtás pillanatában aktuális értékét fogja használni.

Példa:

func példa() {
    x := 1
    defer fmt.Println(x) // x értéke 1 lesz, mert az argumentum azonnal kiértékelődik
    x = 2
}

// A példa() hívásakor kiíródik: 1

Ha lezárást használunk:

func példa() {
    x := 1
    defer func() { fmt.Println(x) }() // a függvény a kilépéskor hívódik, x értéke 2 lesz
    x = 2
}

// A példa() hívásakor kiíródik: 2

Így a defer-ben lévő változó értékének eredménye attól függ, hogyan használjuk — függvény argumentumaként vagy lezáráson keresztül.