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!