Rutin Go menawarkan mekanisme yang berkuasa untuk keselarasan, membolehkan pelaksanaan selari tugas bebas. Walau bagaimanapun, pengendalian panik dalam rutin go boleh menimbulkan cabaran.
Memahami Pulih dalam Rutin Pergi
Fungsi pulih membolehkan pulih daripada panik yang berlaku dalam skop fungsi. Walau bagaimanapun, keberkesanannya terhad kepada goroutine yang sama di mana panik timbul. Percubaan untuk pulih daripada panik dalam goroutine lain akan gagal.
Contoh Kod: Pemulihan Panik Gagal
Berikut ialah coretan kod yang menunjukkan kegagalan untuk pulih daripada panik dalam go routine:
func main() { // Note: the following code will panic go handle(make(chan int64)) for {} } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
Kod ini gagal pulih daripada panik dalam goroutine pemegang kerana recover mesti digunakan dalam goroutine yang sama yang memulakan panik.
Contoh Kod: Pemulihan Panik yang Berjaya
Untuk berjaya pulih daripada panik dalam rutin pergi, pernyataan penangguhan pulih mesti ditambah dalam goroutine yang menyusahkan. Berikut ialah versi kod terdahulu yang diubah suai yang berfungsi seperti yang dijangkakan:
func main() { done := make(chan int64) go func() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }() for {} }
Dalam contoh ini, penyataan pemulihan tertunda membolehkan goroutine mengendalikan panik dan mencatat mesej pemulihan dengan anggun.
Mekanisme Asas
Mengikut dokumentasi Go, penamatan panik hanya berlaku apabila semua fungsi tertunda dalam goroutine semasa telah dilaksanakan. Oleh itu, untuk pulih daripada panik dalam rutin pergi, pulih mesti digunakan dalam goroutine yang sama yang memulakan panik, biasanya melalui fungsi tertunda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Pulih daripada Panik dalam Rutin Pergi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!