Warum funktioniert Panic Recovery mit lokalen Variablen in Go nicht?
In Go ist es üblich, Panic und Recovery zur Fehlerbehandlung zu verwenden . Es gibt jedoch einen subtilen Unterschied im Verhalten bei der Verwendung lokaler Variablen für Rückgabewerte bei der Wiederherstellung nach Panik.
Beachten Sie den folgenden Code:
<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>
Wenn Panik in bar() auftritt, wird die Wiederherstellung( )-Funktion im verzögerten Abschluss wird ausgeführt. Es weist dem Ergebnis -1 zu und erstellt ein Fehlerobjekt. Die Ausgabe dieses Codes ist korrekt:
result: -1 err: panic happened
Wenn wir jedoch lokale Variablen für die Rückgabewerte verwenden:
<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 ist die Ausgabe anders:
result: 0
Das liegt daran, dass die Funktion „recover()“ der lokalen Variablen „result“ -1 zuweist. Da die Funktion jedoch das benannte Rückgabewertergebnis zurückgibt (das mit Null initialisiert wurde), hat die Zuweisung der lokalen Variablen keine Auswirkung.
Der Grund für dieses Verhalten liegt in den Grundlagen der Go-Tour:
„Benannte Rückgabewerte...werden als oben in der Funktion definierte Variablen behandelt.“
Bei Verwendung benannter Rückgabewerte werden Änderungen daran innerhalb des Defer-Abschlusses in den zurückgegebenen Werten widergespiegelt. Bei der Verwendung lokaler Variablen werden die Änderungen jedoch nur im lokalen Bereich widergespiegelt, nicht in den zurückgegebenen Werten.
Das obige ist der detaillierte Inhalt vonWarum ändert die Panikwiederherstellung mit lokalen Variablen die zurückgegebenen Werte in Go nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!