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
Lepaskan: 2024-11-24 06:56:09
asal
1043 orang telah melayarinya

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!")
}
Salin selepas log masuk

Tertunda Bersarang Kes:

Apabila printRecover() dibalut dengan fungsi tertunda bersarang:

func main() {
    defer func() {
        printRecover()
    }()
    panic("OMG!")
}
Salin selepas log masuk

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 Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan