首页 > 后端开发 > Golang > 正文

Go 中的命名返回和正常返回在处理恐慌方面有何不同?

Linda Hamilton
发布: 2024-11-20 11:50:10
原创
264 人浏览过

How Do Named and Normal Returns in Go Differ in Handling Panics?

命名返回揭示了正常返回所隐藏的恐慌

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板