为什么普通返回隐藏了命名返回为调用者提供的恐慌
在 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中文网其他相关文章!