為什麼正常返回會隱藏Panic 與命名返回
提供的場景演示了一種意外行為,其中NormalReturns() 返回nil,儘管發生了恐慌,而NamedReturns() 正確處理恐慌並提供非零錯誤。這種行為源自於 Go 中命名回傳的本質。
命名回傳
如果回傳值被命名,它們實際上是可以在函數內修改的局部變數。 return 語句本質上就是對這些局部變數的賦值。如果發生緊急情況,Go 的執行時間允許在終止程式之前執行延遲函數。這些延遲函數可以存取和修改命名返回變數。
在 NamedReturns() 中,延遲的 catch() 函數修改 err 結果變量,以在發生緊急情況時設定錯誤訊息。由於這發生在函數傳回之前,因此傳回修改後的 err 值而不是 nil。
正常回傳
另一方面,在 NormalReturns() 中,傳回value 被初始化為 nil 並保持原樣,因為在發生恐慌之前未到達 return 語句。局部變數 err 儘管在 deferred 函數中修改了它的值,但對返回值沒有影響。
關鍵區別
因此,named 和name 之間的關鍵區別這種情況下的返回和正常返回在於它們在出現恐慌時修改返回值的能力。命名返回允許延遲函數更新這些值,從而在處理異常方面提供更大的靈活性。然而,由於在發生恐慌之前缺乏明確的 return 語句,因此正常返回無法傳回非 nil 值。
以上是為什麼 Go 中命名返回處理恐慌的方式與正常返回不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!