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

Go 中的延迟函数可以返回值吗?

Linda Hamilton
发布: 2024-11-16 17:46:03
原创
768 人浏览过

Can Deferred Functions Return Values in Go?

从 Go 中的延迟函数返回值

在 Go 中,延迟函数允许您在当前函数执行完毕后执行一段代码。退回或终止。虽然可以修改 defer 函数中返回的参数,但不可能返回一组新的值。

请考虑以下代码:

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err // Attempt to return new values
        }
    }()
    panic("Report format not recognized.")
    // ...
}
登录后复制

在此代码中, defer当发生恐慌时,函数尝试返回 nil 和 err。但是,这不起作用,因为延迟函数无法返回值。相反,返回的参数rep和err必须在defer函数中修改。

此外,代码中存在类型不匹配。恐慌发生在字符串上,而类型断言预计会出现错误。这将导致程序在尝试将恢复的值转换为错误时再次出现恐慌。

要修复代码,我们需要:

  1. 删除从以下位置返回值的尝试defer 函数。
  2. 确保恢复的值正确类型断言。

更正的代码:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        // Find out the exact error type and set err
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        // Invalidate rep
        rep = nil
    }
}()
登录后复制

通过这些更改,defer 函数现在,当出现紧急情况时,可以正确设置 err 和 rep,从而允许调用函数适当地处理错误。

以上是Go 中的延迟函数可以返回值吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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