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.