Sobes.tech
Junior — Middle

Aký je výsledok priradenia hodnoty premennej pomocou konštrukcie defer, keď jej hodnota je nastavená vo vnútri funkcie?

sobes.tech AI

Odpoveď od AI

V jazyku Go, kľúčové slovo defer odkladá vykonanie funkcie do ukončenia okružujúcej funkcie. Argumenty funkcie odovzanej defer sa vyhodnocujú okamžite v momente deklarácie defer, nie počas jej vykonávania.

Ak sa premenná používa vo vnútri funkcie volanej cez defer, jej hodnota bude tá, ktorá bola v momente deklarácie defer, ak bola odovzdaná ako argument. Ak sa premenná používa priamo (napríklad cez uzáver), bude použitá jej aktuálna hodnota v momente vykonania odložené funkcie.

Príklad:

func príklad() {
    x := 1
    defer fmt.Println(x) // x bude 1, pretože argument je vyhodnotený okamžite
    x = 2
}

// Pri volaní príklad(), sa vypíše: 1

Ak sa použije uzáver:

func príklad() {
    x := 1
    defer func() { fmt.Println(x) }() // funkcia bude zavolaná pri ukončení, x bude 2
    x = 2
}

// Pri volaní príklad(), sa vypíše: 2

Takže výsledok priradenia premennej v defer závisí od toho, ako je premenná použitá — ako argument funkcie alebo cez uzáver.