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

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

Linda Hamilton
發布: 2024-11-16 17:46:03
原創
920 人瀏覽過

Can Deferred Functions Return Values in Go?

從 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 // Attempt to return new values

        }

    }()

    panic("Report format not recognized.")

    // ...

}

登入後複製

在此程式碼中, defer當發生恐慌時,函數會嘗試傳回 nil 和 err。但是,這不起作用,因為延遲函數無法傳回值。相反,傳回的參數rep和err必須在defer函數中修改。

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

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

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

修正的程式碼:

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)

        // 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板