Können Verzögerungsfunktionen lokale Variablen während der Panikwiederherstellung in Go ändern?

DDD
Freigeben: 2024-10-29 22:45:03
Original
666 Leute haben es durchsucht

Can Defer Functions Modify Local Variables During Panic Recovery in Go?

Panikwiederherstellung mit lokalen Variablen

In Go kann die Panikwiederherstellung mithilfe von Verzögerungsfunktionen benannte Rückgabewerte innerhalb der umgebenden Funktion ändern. Wenn jedoch lokale Variablen als Rückgabewerte verwendet werden, funktioniert dieser Mechanismus nicht wie erwartet.

Betrachten Sie das folgende Beispiel, in dem benannte Rückgabewerte (Ergebnis und Fehler) innerhalb der Defer-Funktion geändert werden:

<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

Dieser Code behebt eine Panik und ändert die benannten Rückgabewerte result und err korrekt. Betrachten Sie jedoch das folgende Beispiel, in dem lokale Variablen als Rückgabewerte verwendet werden:

<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 kann die Defer-Funktion die Ergebnis- und Fehlervariablen nicht ändern, was zu einer unerwarteten Ausgabe führt, bei der das Ergebnis 0 bleibt.

Dieses Verhalten ergibt sich aus der Tatsache, dass die Defer-Anweisung auf das Funktionsliteral und nicht auf die umgebende Funktion selbst angewendet wird. Folglich sind die lokalen Variablen (result und err) innerhalb des Funktionsliterals nicht zugänglich. Im Gegensatz dazu sind benannte Rückgabewerte innerhalb des Funktionsliterals zugänglich, da es sich im Wesentlichen um Variablen handelt, die am Anfang der Funktion initialisiert werden.

Das obige ist der detaillierte Inhalt vonKönnen Verzögerungsfunktionen lokale Variablen während der Panikwiederherstellung in Go ändern?. 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
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!