Heim > Artikel > Backend-Entwicklung > Können Defer-Anweisungen verwendet werden, um Rückgabewerte in in Panik geratenen Funktionen zu manipulieren?
Rückgabewerte mit Defer manipulieren
In Go kann die Defer-Anweisung verwendet werden, um eine Funktion auszuführen, nachdem die umgebende Funktion zurückgegeben wurde. Mit diesem Mechanismus können Sie Bereinigungsaufgaben erledigen oder Aktionen ausführen, selbst wenn ein Fehler auftritt. Es gibt jedoch eine Einschränkung, wenn versucht wird, einen Fehlerwert von einer Funktion zurückzugeben, die in Panik gerät und in einer Defer-Anweisung eingeschlossen ist.
Beachten Sie den folgenden Codeausschnitt:
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 } }() panic("Report format not recognized.") // Remaining function code... }
Die Absicht ist um einen Fehler zurückzugeben, wenn die getReport-Funktion in Panik gerät. Dieser Ansatz funktioniert jedoch nicht, da Verzögerungsfunktionen die Anzahl der Rückgabewerte in der umgebenden Funktion nicht ändern können. Stattdessen können sie nur die Werte der vorhandenen Rückgabeparameter ändern.
Um dieses Problem zu beheben, sollte die Defer-Funktion den Rückgabeparameter „err“ ändern, anstatt zu versuchen, einen neuen Fehlerwert zurückzugeben:
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 dieser Änderung aktualisiert die Defer-Funktion den Rückgabeparameter err und setzt rep auf Null, um eine Fehlerbedingung anzuzeigen. Dadurch kann die umgebende Funktion den geänderten Fehlerwert zurückgeben.
Das obige ist der detaillierte Inhalt vonKönnen Defer-Anweisungen verwendet werden, um Rückgabewerte in in Panik geratenen Funktionen zu manipulieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!