Sobes.tech
Middle+

Kdy je inicializovaná hodnota proměnné předána operátoru defer a jak je to spojeno s pojmenováním funkce?

sobes.tech AI

Odpověď od AI

V jazyce Go jsou argumenty funkce, včetně těch používaných v příkazu defer, vyhodnocovány v okamžiku volání defer, nikoli při skutečném provádění odložené funkce.

To znamená, že pokud je proměnná předána defer, její hodnota je fixována okamžitě při deklaraci defer, i když odložená funkce bude později vykonána, například po opuštění funkce.

Příklad:

func priklad() (vysledek int) {
    x := 5
    defer fmt.Println("defer x:", x) // x je zde fixováno, je 5
    x = 10
    return x
}

Při volání priklad() bude výstup "defer x: 5", i když v okamžiku návratu je x již 10.

Co se týče pojmenovaných návratových hodnot, defer je může měnit, pokud k nim odložená funkce má přímý přístup:

func priklad() (vysledek int) {
    defer func() {
        vysledek += 1 // měníme pojmenovaný výsledek
    }()
    vysledek = 5
    return // vrátí 6 po provedení defer
}

Tedy, defer fixuje hodnoty argumentů při deklaraci, ale může ovlivnit pojmenované návratové hodnoty, pokud jsou v rámci odložené funkce změněny.