Sobes.tech
Junior — Middle

Jaký je výsledek při přiřazení hodnoty proměnné pomocí konstrukce defer, když je její hodnota nastavena uvnitř funkce?

sobes.tech AI

Odpověď od AI

V jazyce Go klíčové slovo defer odkládá vykonání funkce do okamžiku, kdy se ukončí okolní funkce. Argumenty funkce předané defer jsou vyhodnoceny ihned v okamžiku deklarace defer, nikoliv při jejím provádění.

Pokud je proměnná použita uvnitř funkce volané přes defer, bude její hodnota ta, která byla v okamžiku deklarace defer, pokud byla předána jako argument. Pokud je proměnná použita přímo (například přes uzávěrku), bude použita její aktuální hodnota v okamžiku provádění odložené funkce.

Příklad:

func priklad() {
    x := 1
    defer fmt.Println(x) // x bude 1, protože argument je vyhodnocen okamžitě
    x = 2
}

// Při volání priklad(), se vypíše: 1

Pokud je použita uzávěrka:

func priklad() {
    x := 1
    defer func() { fmt.Println(x) }() // funkce bude volána při ukončení, x bude 2
    x = 2
}

// Při volání priklad(), se vypíše: 2

Tedy výsledek přiřazení proměnné v defer závisí na tom, jak je proměnná použita — jako argument funkce nebo přes uzávěrku.