Go 中延遲回傳
在 Go 中,defer 語句允許延遲函數的執行,直到周圍的函數傳回。這允許即使在發生緊急情況時也能執行清理任務,這種情況在運行時發生不可恢復的錯誤時可能會發生。
考慮以下程式碼片段,如果函數發生緊急情況,它會嘗試從函數傳回錯誤:
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.") // rest of the getReport function }
但是,此程式碼無法如預期運作。 deferred函數內的return語句只是修改了函數內的局部變數err和rep,並沒有真正將它們傳回函數外。
為了解決這個問題,我們可以使用deferred函數內的recover函數來檢索恐慌值並相應地設定 err 參數。此外,我們應該檢查恐慌值的類型,並在必要時將其轉換為錯誤。
這是更新的程式碼:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } rep = nil } }()
此程式碼確保err 參數設定為基於恐慌值的適當錯誤,而且它還會使rep參數無效以防止傳回不完整的報告。
以上是如何處理 Go 函數中的恐慌和延遲返回?的詳細內容。更多資訊請關注PHP中文網其他相關文章!