首页 >后端开发 >Golang >Go 中的延迟函数可以在紧急恢复期间修改局部变量吗?

Go 中的延迟函数可以在紧急恢复期间修改局部变量吗?

DDD
DDD原创
2024-10-29 22:45:03748浏览

Can Defer Functions Modify Local Variables During Panic Recovery in Go?

使用局部变量进行紧急恢复

在 Go 中,使用 defer 函数的紧急恢复可以修改周围函数内的命名返回值。但是,当局部变量用作返回值时,此机制无法按预期运行。

考虑以下示例,其中在 defer 函数中修改命名返回值(结果和错误):

<code class="go">func main() {
    result, err := foo()
    fmt.Println("result:", result)
    if err != nil {
        fmt.Println("err:", err)
    }
}

func foo() (result int, err error) {
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()

    result = 100
    err = nil
    return
}

func bar() {
    panic("panic happened")
}</code>

这段代码从恐慌中恢复并正确修改了命名的返回值 result 和 err。但是,请考虑以下示例,其中局部变量用作返回值:

<code class="go">func main() {
    result, err := foo()
    fmt.Println("result:", result)
    if err != nil {
        fmt.Println("err:", err)
    }
}

func foo() (int, error) {
    var result int
    var err error
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()

    result = 100
    err = nil
    return result, err
}

func bar() {
    panic("panic happened")
}</code>

在这种情况下,defer 函数无法修改 result 和 err 变量,从而导致意外输出,其中 result 仍为 0。

此行为是由于 defer 语句应用于函数文字而不是周围函数本身这一事实引起的。因此,局部变量(结果和错误)在函数文字中不可访问。相反,命名返回值可以在函数文字中访问,因为它们本质上是在函数开头初始化的变量。

以上是Go 中的延迟函数可以在紧急恢复期间修改局部变量吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn