Pemulihan Fungsi Pemanggil daripada Child Goroutine Panic
Bertentangan dengan kepercayaan popular, panik goroutine tidak semestinya menamatkan keseluruhan program. Salah tanggapan ini berpunca daripada andaian bahawa fungsi pemulihan tertunda dalam pemanggil akan menangani panik. Walau bagaimanapun, ini tidak berlaku jika pemanggil selesai sebelum panik berlaku dalam goroutine.
Pertimbangkan contoh berikut:
<code class="go">func fun1() { fmt.Println("fun1 started") defer func() { if err := recover(); err != nil { fmt.Println("recover in func1") } }() go fun2() time.Sleep(10 * time.Second) // wait for the boom! fmt.Println("fun1 ended") } func fun2() { fmt.Println("fun2 started") time.Sleep(5 * time.Second) panic("fun2 booom!") fmt.Println("fun2 ended") }</code>
Walaupun fungsi pemanggil (fun1) menyelesaikan pelaksanaan, program masih ditamatkan jika fun2 panik. Ini berlaku kerana spesifikasi Go mentakrifkan bahawa apabila panik berlaku dalam goroutine:
Dalam kes ini, fun2 ialah fungsi peringkat teratas dalam goroutine, dan ia tidak pulih daripada panik. Oleh itu, program ini ditamatkan.
Perkara utama ialah:
Groutine tidak dapat pulih daripada panik yang berlaku dalam goroutine lain.
Atas ialah kandungan terperinci Bolehkah Fungsi Pemanggil Pulih daripada Panik Goroutine Kanak-kanak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!