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