從 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 // Attempt to return new values } }() panic("Report format not recognized.") // ... }
在此程式碼中, defer當發生恐慌時,函數會嘗試傳回 nil 和 err。但是,這不起作用,因為延遲函數無法傳回值。相反,傳回的參數rep和err必須在defer函數中修改。
此外,程式碼中存在類型不符。恐慌發生在字串上,而類型斷言預計會出現錯誤。這將導致程式在嘗試將恢復的值轉換為錯誤時再次出現恐慌。
要修復程式碼,我們需要:
修正的程式碼:
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 } }()
透過這些更改,defer 函數現在,當出現緊急情況時,可以正確設定err 和rep,從而允許呼叫函數適當地處理錯誤。
以上是Go 中的延遲函數可以傳回值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!