Bagaimanakah Fungsi Pemanggil Pulih daripada Panik Child Goroutine?
Sebelum ini, diandaikan bahawa panik dalam goroutine akan menamatkan program jika pemanggilnya selesai sebelum panik berlaku. Walau bagaimanapun, percubaan dengan kod sampel mendedahkan sebaliknya.
Kod Contoh:
<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>
Gelagat Tidak Dijangka:
Walaupun jangkaan bahawa mekanisme pemulihan fungsi pemanggil akan mengendalikan panik goroutine, keseluruhan program masih ditamatkan.
Penjelasan:
Spesifikasi Go menyatakan bahawa:
Apabila fun2 ialah fungsi peringkat atas yang dilaksanakan dalam goroutine dan fun2 tidak pulih daripada panik, program ditamatkan apabila fun2 panik.
Memandangkan fun2 ialah fungsi peringkat teratas dalam goroutinenya dan ia berfungsi tidak mengendalikan panik, program ditamatkan lebih awal.
Autonomi Goroutine:
Groutine tidak boleh pulih daripada panik dalam goroutine lain. Oleh itu, panggilan tertunda dalam fun1 tidak digunakan apabila fun2 panik.
Kesimpulan:
Fungsi pemanggil tidak boleh pulih daripada panik dalam goroutine yang dicipta melainkan goroutine secara jelas pulih daripada panik sebelum pemanggil program ditamatkan.
Atas ialah kandungan terperinci Bolehkah Fungsi Pemanggil Pulih daripada Kepanikan Kanak-kanak Goroutine dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!