Rumah >pembangunan bahagian belakang >Golang >Mengapakah `recover()` Mengembalikan `nil` dalam Nested Deferred Functions dalam Go?

Mengapakah `recover()` Mengembalikan `nil` dalam Nested Deferred Functions dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-11-24 06:56:091016semak imbas

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

Gelagat Recover() dalam Fungsi Tertunda Bersarang

Dalam Go, panic() dan recover() digunakan untuk mengendalikan ralat masa jalan . Walau bagaimanapun, ralat boleh pulih mesti dikendalikan oleh fungsi tertunda.

Kes Mudah:

Dalam senario fungsi tertunda yang mudah, fungsi recover() seperti yang dijangkakan:

package main

import "fmt"

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

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

Tertunda Bersarang Kes:

Apabila printRecover() dibalut dengan fungsi tertunda bersarang:

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

tingkah laku berubah. recover() dalam printRecover() mengembalikan sifar. Ini kerana:

Mengikut spesifikasi Go:

Nilai pulangan recover() adalah sifar jika recover() tidak dipanggil terus oleh fungsi tertunda.

Dalam kes bersarang, printRecover() dipanggil oleh fungsi tertunda bersarang, bukan secara langsung oleh permulaan satu.

Kesimpulan:

Untuk recover() berfungsi dalam fungsi tertunda bersarang, ia mesti dipanggil terus oleh fungsi tertunda yang mengendalikan panik. Apabila syarat ini tidak dipenuhi, recover() akan mengembalikan sifar.

Atas ialah kandungan terperinci Mengapakah `recover()` Mengembalikan `nil` dalam Nested Deferred Functions dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn