Heim >Backend-Entwicklung >Golang >Wie gehe ich mit Paniken um und verschiebe Rückgaben in Go-Funktionen?
Aufschieben einer Rückkehr in Go
In Go ermöglicht die Defer-Anweisung, die Ausführung einer Funktion zu verschieben, bis die umgebende Funktion zurückkehrt. Dadurch können Bereinigungsaufgaben auch im Panikfall ausgeführt werden, der auftreten kann, wenn während der Laufzeit nicht behebbare Fehler auftreten.
Beachten Sie den folgenden Codeausschnitt, der versucht, einen Fehler von einer Funktion zurückzugeben, wenn diese in Panik gerät:
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.") // rest of the getReport function }
Dieser Code funktioniert jedoch nicht wie vorgesehen. Die Return-Anweisung innerhalb der verzögerten Funktion ändert nur die lokalen Variablen err und rep innerhalb der Funktion und gibt sie nicht tatsächlich außerhalb der Funktion zurück.
Um dieses Problem zu beheben, können wir die Wiederherstellungsfunktion innerhalb der verzögerten Funktion verwenden Rufen Sie den Panikwert ab und legen Sie den Fehlerparameter entsprechend fest. Zusätzlich sollten wir den Typ des Panikwerts überprüfen und ihn gegebenenfalls in einen Fehler umwandeln.
Hier ist ein aktualisierter Code:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } rep = nil } }()
Dieser Code stellt sicher, dass der Fehlerparameter auf gesetzt ist Der entsprechende Fehler wird basierend auf dem Panikwert angezeigt. Außerdem wird der Rep-Parameter ungültig gemacht, um zu verhindern, dass ein unvollständiger Bericht zurückgegeben wird.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Paniken um und verschiebe Rückgaben in Go-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!