为什么正常返回可以隐藏命名返回正确提供给调用者的恐慌?
在 Go 中,return 语句初始化所有在执行延迟函数之前将结果参数设置为零值。如果存在命名结果参数并且未到达 return 语句,这些命名参数将保留零值。
提供的示例演示了此行为:
func NormalReturns(n int) error { var err error defer catch(&err) panicIf42(n) return err }
这里, err 变量被初始化为 nil,但由于恐慌而未到达 return 语句,因此它仍然是 nil。即使 defer catch() 修改了 err,这种变化也不会反映在返回值中,因为 return 语句指定了一个空的表达式列表。
相反,命名返回允许延迟函数在返回后修改返回值声明并在返回给调用者之前。下面的函数举例说明了这一点:
func NamedReturns(n int) (err error) { defer catch(&err) panicIf42(n) return }
在这种情况下, err 被初始化为 nil,但延迟的 catch() 能够在函数返回之前修改它。因此,分配给 err 的任何非零值都将返回给调用者。
此行为突出了命名返回和正常返回之间的关键区别。通过命名返回,延迟函数可以更改返回值,从而提供一种方法来确保相关信息传播回调用者,即使在发生恐慌时也是如此。
以上是Go 中的命名返回如何以不同于正常返回的方式处理恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!