Heim >Backend-Entwicklung >Golang >Warum ändert die Panikwiederherstellung mit lokalen Variablen die zurückgegebenen Werte in Go nicht?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-29 23:31:29544Durchsuche

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>

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

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>

In diesem Fall ist die Ausgabe anders:

result: 0

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!

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