Heim  >  Artikel  >  Backend-Entwicklung  >  Können verzögerte Funktionen in Go Werte zurückgeben?

Können verzögerte Funktionen in Go Werte zurückgeben?

Linda Hamilton
Linda HamiltonOriginal
2024-11-16 17:46:03773Durchsuche

Can Deferred Functions Return Values in Go?

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:

  1. den Versuch, Werte zurückzugeben, entfernen die Verzögerungsfunktion.
  2. Stellen Sie sicher, dass der wiederhergestellte Wert korrekt typgesichert ist.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn