Rumah >pembangunan bahagian belakang >Golang >Bolehkah Fungsi Tertunda Mengembalikan Nilai dalam Go?
Memulangkan Nilai daripada Fungsi Tertunda dalam Go
Dalam Go, fungsi penangguhan membolehkan anda melaksanakan blok kod selepas fungsi semasa mempunyai dikembalikan atau ditamatkan. Walaupun mungkin untuk mengubah suai parameter yang dikembalikan dalam fungsi penangguhan, ia tidak mungkin untuk mengembalikan set nilai baharu.
Pertimbangkan 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 // Attempt to return new values } }() panic("Report format not recognized.") // ... }
Dalam kod ini, penangguhan fungsi cuba mengembalikan sifar dan tersilap apabila panik berlaku. Walau bagaimanapun, ini tidak akan berfungsi kerana fungsi tangguh tidak dapat mengembalikan nilai. Sebaliknya, parameter yang dikembalikan, rep dan err, mesti diubah suai dalam fungsi tangguh.
Selain itu, terdapat jenis yang tidak sepadan dalam kod. Panik berlaku dengan rentetan, manakala penegasan jenis menjangkakan ralat. Ini akan menyebabkan atur cara panik sekali lagi apabila cuba menukar nilai yang dipulihkan kepada ralat.
Untuk membetulkan kod, kita perlu:
Kod yang diperbetulkan:
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 perubahan ini, fungsi tangguh kini menetapkan ralat dan rep dengan betul apabila panik berlaku, membolehkan fungsi panggilan mengendalikan ralat dengan sewajarnya.
Atas ialah kandungan terperinci Bolehkah Fungsi Tertunda Mengembalikan Nilai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!