Warum ändert die Panikwiederherstellung mit lokalen Variablen die zurückgegebenen Werte in Go nicht?

Patricia Arquette
Freigeben: 2024-10-29 23:31:29
Original
404 Leute haben es durchsucht

Why Does Panic Recovery with Local Variables Not Change the Returned Values in Go?

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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>
Nach dem Login kopieren

In diesem Fall ist die Ausgabe anders:

result: 0
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!