Heim  >  Artikel  >  Backend-Entwicklung  >  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
Patricia ArquetteOriginal
2024-11-24 06:56:09906Durchsuche

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!")
}

Verschachtelter verzögerter Fall:

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

func main() {
    defer func() {
        printRecover()
    }()
    panic("OMG!")
}

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!

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