Panikwiederherstellung mit lokalen Variablen
In Go kann die Panikwiederherstellung mithilfe von Verzögerungsfunktionen benannte Rückgabewerte innerhalb der umgebenden Funktion ändern. Wenn jedoch lokale Variablen als Rückgabewerte verwendet werden, funktioniert dieser Mechanismus nicht wie erwartet.
Betrachten Sie das folgende Beispiel, in dem benannte Rückgabewerte (Ergebnis und Fehler) innerhalb der Defer-Funktion geändert werden:
<code class="go">func main() { result, err := foo() fmt.Println("result:", result) if err != nil { fmt.Println("err:", err) } } func foo() (result int, err error) { defer func() { if e := recover(); e != nil { result = -1 err = errors.New(e.(string)) } }() bar() result = 100 err = nil return } func bar() { panic("panic happened") }</code>
Dieser Code behebt eine Panik und ändert die benannten Rückgabewerte result und err korrekt. Betrachten Sie jedoch das folgende Beispiel, in dem lokale Variablen als Rückgabewerte verwendet werden:
<code class="go">func main() { result, err := foo() fmt.Println("result:", result) if err != nil { fmt.Println("err:", err) } } func foo() (int, error) { var result int var err error defer func() { if e := recover(); e != nil { result = -1 err = errors.New(e.(string)) } }() bar() result = 100 err = nil return result, err } func bar() { panic("panic happened") }</code>
In diesem Fall kann die Defer-Funktion die Ergebnis- und Fehlervariablen nicht ändern, was zu einer unerwarteten Ausgabe führt, bei der das Ergebnis 0 bleibt.
Dieses Verhalten ergibt sich aus der Tatsache, dass die Defer-Anweisung auf das Funktionsliteral und nicht auf die umgebende Funktion selbst angewendet wird. Folglich sind die lokalen Variablen (result und err) innerhalb des Funktionsliterals nicht zugänglich. Im Gegensatz dazu sind benannte Rückgabewerte innerhalb des Funktionsliterals zugänglich, da es sich im Wesentlichen um Variablen handelt, die am Anfang der Funktion initialisiert werden.
Das obige ist der detaillierte Inhalt vonKönnen Verzögerungsfunktionen lokale Variablen während der Panikwiederherstellung in Go ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!