為什麼普通返回隱藏了命名返回為調用者提供的恐慌
在Go 中,普通返回和命名返回語句都會被使用從函數返回值。然而,當函數發生恐慌時,它們的行為存在細微的差異。
在正常返回中,當呼叫函數時,返回值被初始化為零值。如果函數在到達 return 語句之前發生恐慌,則傳回值將保持為零值。例如,如果函數傳回錯誤值,那麼如果函數發生恐慌,正常回傳將始終傳回 nil。
相反,命名返回允許延遲函數或函數本身在之前修改返回值該函數返回其呼叫者。如果具有命名返回值的函數發生恐慌,則延遲函數可以在函數返回到其呼叫者之前修改返回值。
可以透過以下範例說明這種差異:
package main 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) }
輸出這個程式的內容是:
2009/11/10 23:00:00 NamedReturns error: recovered panic: 42! 2009/11/10 23:00:00 NormalReturns error: <nil>
如你所見,命名回傳一個非零錯誤,而正常返回返回零。這是因為 NamedReturns 函數的延遲 catch 函數會在函數返回到其呼叫者之前修改 err 回傳值。
此行為對於在整個程序中以一致的方式處理錯誤非常有用。透過使用命名傳回,您可以確保所有函數在發生恐慌時傳回非零錯誤,即使恐慌發生在函數到達 return 語句之前。
以上是當函數發生緊急情況時,Go 中的命名回傳和正常回傳有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!