Mengapa Pemulihan Panik dengan Pembolehubah Setempat Tidak Mengubah Nilai yang Dikembalikan dalam Go?

Patricia Arquette
Lepaskan: 2024-10-29 23:31:29
asal
404 orang telah melayarinya

Why Does Panic Recovery with Local Variables Not Change the Returned Values in Go?

Mengapa Pemulihan Panik dengan Pembolehubah Setempat Tidak Berfungsi dalam Go?

Dalam Go, adalah amalan biasa untuk menggunakan panik dan pemulihan untuk pengendalian ralat . Walau bagaimanapun, terdapat perbezaan kecil dalam tingkah laku apabila menggunakan pembolehubah tempatan untuk nilai pulangan dalam pemulihan panik.

Pertimbangkan kod berikut:

<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>
Salin selepas log masuk

Apabila panik berlaku dalam bar(), recover( ) fungsi dalam penutupan tertunda dilaksanakan. Ia memberikan -1 kepada hasil dan mencipta objek ralat. Output kod ini adalah betul:

result: -1
err: panic happened
Salin selepas log masuk

Walau bagaimanapun, jika kita menggunakan pembolehubah tempatan untuk nilai pulangan:

<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>
Salin selepas log masuk

Dalam kes ini, output adalah berbeza:

result: 0
Salin selepas log masuk

Ini kerana fungsi recover() memberikan -1 kepada 'hasil' pembolehubah tempatan. Walau bagaimanapun, oleh kerana fungsi mengembalikan hasil nilai pulangan yang dinamakan (yang dimulakan sifar), penugasan pembolehubah tempatan tidak mempunyai kesan.

Sebab bagi tingkah laku ini terletak pada asas lawatan Pergi:

"Nilai pulangan bernama...dilayan sebagai pembolehubah yang ditakrifkan di bahagian atas fungsi."

Apabila menggunakan nilai pulangan dinamakan, perubahan padanya dalam penutupan penangguhan ditunjukkan dalam nilai yang dikembalikan. Walau bagaimanapun, apabila menggunakan pembolehubah tempatan, perubahan hanya ditunjukkan dalam skop setempat, bukan dalam nilai yang dikembalikan.

Atas ialah kandungan terperinci Mengapa Pemulihan Panik dengan Pembolehubah Setempat Tidak Mengubah Nilai yang Dikembalikan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!