Heim > Artikel > Backend-Entwicklung > Können verzögerte Funktionen in Go Werte zurückgeben?
Werte von verzögerten Funktionen in Go zurückgeben
In Go können Sie mit einer Verzögerungsfunktion einen Codeblock ausführen, nachdem die aktuelle Funktion ausgeführt wurde zurückgegeben oder gekündigt. Während es möglich ist, die zurückgegebenen Parameter innerhalb einer Defer-Funktion zu ändern, ist es nicht möglich, einen neuen Satz von Werten zurückzugeben.
Beachten Sie den folgenden Code:
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err // Attempt to return new values } }() panic("Report format not recognized.") // ... }
In diesem Code ist die Defer Die Funktion versucht, Null und Fehler zurückzugeben, wenn eine Panik auftritt. Dies funktioniert jedoch nicht, da Verzögerungsfunktionen keine Werte zurückgeben können. Stattdessen müssen die zurückgegebenen Parameter rep und err innerhalb der Defer-Funktion geändert werden.
Außerdem gibt es eine Typinkongruenz im Code. Die Panik tritt bei einer Zeichenfolge auf, während die Typzusicherung einen Fehler erwartet. Dies führt dazu, dass das Programm erneut in Panik gerät, wenn es versucht, den wiederhergestellten Wert in einen Fehler umzuwandeln.
Um den Code zu beheben, müssen wir:
Der korrigierte Code:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // Find out the exact error type and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // Invalidate rep rep = nil } }()
Mit diesen Änderungen setzt die Defer-Funktion jetzt korrekt err und rep, wenn eine Panik auftritt, sodass die aufrufende Funktion den Fehler angemessen behandeln kann.
Das obige ist der detaillierte Inhalt vonKönnen verzögerte Funktionen in Go Werte zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!