Heim > Backend-Entwicklung > Golang > Warum gibt „recover()' in verschachtelten verzögerten Funktionen in Go „nil' zurück?

Warum gibt „recover()' in verschachtelten verzögerten Funktionen in Go „nil' zurück?

Patricia Arquette
Freigeben: 2024-11-24 06:56:09
Original
986 Leute haben es durchsucht

Why Does `recover()` Return `nil` in Nested Deferred Functions in Go?

Verhalten von Recover() in verschachtelten verzögerten Funktionen

In Go werden panic() und restart() zur Behandlung von Laufzeitfehlern verwendet . Behebbare Fehler müssen jedoch durch verzögerte Funktionen behandelt werden.

Einfacher Fall:

In einem einfachen Szenario mit verzögerten Funktionen funktioniert „recover()“ wie erwartet:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer printRecover()
    panic("OMG!")
}
Nach dem Login kopieren

Verschachtelter verzögerter Fall:

Wenn printRecover() in a eingeschlossen ist verschachtelte verzögerte Funktion:

func main() {
    defer func() {
        printRecover()
    }()
    panic("OMG!")
}
Nach dem Login kopieren

das Verhalten ändert sich. „recover()“ in „printRecover()“ gibt Null zurück. Dies liegt daran, dass:

Gemäß der Go-Spezifikation:

Der Rückgabewert von „recover()“ ist Null, wenn „recover()“ nicht direkt von einer verzögerten Funktion aufgerufen wurde.

Im verschachtelten Fall wird printRecover() von der verschachtelten verzögerten Funktion aufgerufen, nicht direkt von der Initiale eins.

Schlussfolgerung:

Damit „recover()“ in verschachtelten verzögerten Funktionen funktioniert, muss es direkt von der verzögerten Funktion aufgerufen werden, die die Panik verarbeitet. Wenn diese Bedingung nicht erfüllt ist, gibt Recovery() Null zurück.

Das obige ist der detaillierte Inhalt vonWarum gibt „recover()' in verschachtelten verzögerten Funktionen in Go „nil' zurück?. 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