
從 Go 中的延遲函數傳回值
在 Go 中,延遲函數可讓您在目前函數執行完畢後執行一段程式碼。退回或終止。雖然可以修改 defer 函數中傳回的參數,但不可能傳回一組新的值。
請考慮以下程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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." )
}
|
登入後複製
在此程式碼中, defer當發生恐慌時,函數會嘗試傳回 nil 和 err。但是,這不起作用,因為延遲函數無法傳回值。相反,傳回的參數rep和err必須在defer函數中修改。
此外,程式碼中存在類型不符。恐慌發生在字串上,而類型斷言預計會出現錯誤。這將導致程式在嘗試將恢復的值轉換為錯誤時再次出現恐慌。
要修復程式碼,我們需要:
- 刪除從下列位置傳回值的嘗試defer 函數。
- 確保復原的值正確型別斷言。
修正的程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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
}
}()
|
登入後複製
透過這些更改,defer 函數現在,當出現緊急情況時,可以正確設定err 和rep,從而允許呼叫函數適當地處理錯誤。
以上是Go 中的延遲函數可以傳回值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!