在 Go 中,正常返回和命名返回之間的差異超出了可讀性。命名回傳允許修改傳回值,從而影響發生恐慌時的結果。
考慮以下程式碼:
import ( "fmt" "log" ) func catch(err *error) { if r := recover(); r != nil { *err = fmt.Errorf("recovered panic: %v", r) } } func panicIf42(n int) { if n == 42 { panic("42!") } } 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 } func main() { err := NamedReturns(42) log.Printf("NamedReturns error: %v", err) err = NormalReturns(42) log.Printf("NormalReturns error: %v", err) }
意外的是,NormalReturns 回傳 nil,而 NamedReturns 回傳錯誤。如何解釋這種行為?
在NormalReturns中,回傳值被初始化為nil(錯誤的零值)。由於panicIf42()中的panic阻止了return語句的到達,結果變數仍然設定為nil。
相反,NamedReturns宣告了一個命名的回傳變數err。發生恐慌時,延遲的 catch() 函數會修改此變數。即使未執行 return 語句,命名結果值也會被保留並傳回。
命名返回提供了更大的靈活性和對返回值的控制。它們允許透過延遲函數修改傳回值,並確保即使在發生緊急情況時也傳回指定的值。透過了解這些細微差別,開發人員可以有效地使用命名回傳來處理異常情況並準確傳達錯誤條件。
以上是Go 中的命名返回和正常返回在處理恐慌方面有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!