首頁  >  文章  >  後端開發  >  Go 中的命名返回如何以不同於正常返回的方式處理恐慌?

Go 中的命名返回如何以不同於正常返回的方式處理恐慌?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-20 02:14:02725瀏覽

How Do Named Returns in Go Handle Panics Differently Than Normal Returns?

為什麼正常回傳可以隱藏命名回傳正確提供給呼叫者的恐慌?

在 Go 中,return 語句初始化所有在執行延遲函數之前將結果參數設為零值。如果存在命名結果參數且未到達 return 語句,則這些命名參數將保留零值。

提供的範例示範了此行為:

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

這裡, err 變數被初始化為 nil,但由於恐慌而未到達 return 語句,因此它仍然是 nil。即使 defer catch() 修改了 err,這種變化也不會反映在回傳值中,因為 return 語句指定了一個空的表達式清單。

相反,命名返回允許延遲函數在返回後修改返回值聲明並在返回給呼叫者之前。下面的函數舉例說明了這一點:

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

在這種情況下, err 被初始化為 nil,但延遲的 catch() 能夠在函數返回之前修改它。因此,指派給 err 的任何非零值都會傳回給呼叫者。

此行為突顯了命名返回和正常返回之間的關鍵區別。透過命名返回,延遲函數可以更改返回值,從而提供一種方法來確保相關資訊傳播回呼叫者,即使在發生恐慌時也是如此。

以上是Go 中的命名返回如何以不同於正常返回的方式處理恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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