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.