Rumah >pembangunan bahagian belakang >Golang >Mengapa Pemulihan Panik dengan Pembolehubah Setempat Tidak Mengubah Nilai yang Dikembalikan dalam Go?

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

Patricia Arquette
Patricia Arquetteasal
2024-10-29 23:31:29577semak imbas

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>

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

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>

Dalam kes ini, output adalah berbeza:

result: 0

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!

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