Memanipulasi Nilai Pulangan dengan Tangguh
Dalam Go, penyataan penangguhan boleh digunakan untuk melaksanakan fungsi selepas fungsi sekeliling kembali. Mekanisme ini membolehkan anda mengendalikan tugas pembersihan atau melakukan tindakan walaupun ralat berlaku. Walau bagaimanapun, terdapat had apabila cuba mengembalikan nilai ralat daripada fungsi yang panik dan disertakan dalam pernyataan tangguh.
Pertimbangkan coretan kod berikut:
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err } }() panic("Report format not recognized.") // Remaining function code... }
Niatnya ialah untuk mengembalikan ralat jika fungsi getReport panik. Walau bagaimanapun, pendekatan ini tidak berfungsi kerana fungsi tangguh tidak boleh mengubah bilangan nilai pulangan dalam fungsi sekeliling. Sebaliknya, mereka hanya boleh mengubah suai nilai parameter pulangan sedia ada.
Untuk menangani isu ini, fungsi tangguh harus mengubah suai parameter err return dan bukannya cuba mengembalikan nilai ralat baharu:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // Find out the exact error type and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // Invalidate rep rep = nil } }()
Dengan pengubahsuaian ini, fungsi tangguh mengemas kini parameter err return dan menetapkan rep kepada nil untuk menunjukkan keadaan ralat. Ini membolehkan fungsi sekeliling mengembalikan nilai ralat yang diubah suai.
Atas ialah kandungan terperinci Bolehkah Penyata Tangguh Digunakan untuk Memanipulasi Nilai Pulangan dalam Fungsi Panik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!