首頁 > 後端開發 > Golang > Go 命名回傳與正常回傳:為什麼恐慌處理不同?

Go 命名回傳與正常回傳:為什麼恐慌處理不同?

Susan Sarandon
發布: 2024-12-07 03:31:10
原創
771 人瀏覽過

Go Named Returns vs. Normal Returns: Why Does Panic Handling Differ?

為什麼普通返回會隱藏恐慌,而命名返回則將其提供給調用者

在 Go 中,命名結果參數允許分配特定值以由功能。但是,此行為與不帶命名結果參數返回的函數不同,這可能會引發問題。

考慮以下程式碼,其中NormalReturns 和NamedReturns 是嘗試在發生緊急情況時返回錯誤的函數:

func NormalReturns(n int) error {
    var err error
    defer catch(&err)
    panicIf42(n)
    return err
}

func NamedReturns(n int) (err error) {
    defer catch(&err)
    panicIf42(n)
    return
}
登入後複製

當在panicIf42中引發恐慌時,NormalReturns預計返回nil,即使人們會出現錯誤。發生這種情況是因為延遲的 catch 函數在恐慌將控制權傳回給呼叫者之後分配錯誤。

相反,NamedReturns 會傳回修改後的 err 值,因為命名結果參數允許延遲函數修改它們。當發生恐慌時,延遲的 catch 函數分配錯誤,該錯誤被保留並在函數結束時返回。

傳回語句規格:

「所有結果在進入函數時,數值被初始化為其類型的零值...在任何延遲函數執行之前指定結果集結果參數的「返回」語句"

延遲語句規範:

「延遲函數可以在結果參數返回之前存取和修改它們。」

因此,在NormalReturns中,由於沒有命名結果參數,因此返回值被初始化為nil,並在panic後保持為nil。在NamedReturns中,deferred函數修改了err結果參數,其值作為傳回的錯誤。

以上是Go 命名回傳與正常回傳:為什麼恐慌處理不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板