首頁  >  文章  >  後端開發  >  Go 中的延遲函數可以傳回值嗎?

Go 中的延遲函數可以傳回值嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-16 17:46:03769瀏覽

Can Deferred Functions Return Values in Go?

從 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函數中修改。

此外,程式碼中存在類型不符。恐慌發生在字串上,而類型斷言預計會出現錯誤。這將導致程式在嘗試將恢復的值轉換為錯誤時再次出現恐慌。

要修復程式碼,我們需要:

  1. 刪除從下列位置傳回值的嘗試defer 函數。
  2. 確保復原的值正確型別斷言。

修正的程式碼:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn