首页  >  文章  >  后端开发  >  紧急恢复可以修改 Go 中函数文字中的局部变量吗?

紧急恢复可以修改 Go 中函数文字中的局部变量吗?

Susan Sarandon
Susan Sarandon原创
2024-10-31 09:18:02286浏览

Can Panic Recovery Modify Local Variables in Function Literals in Go?

紧急恢复可以修改函数文字中的局部变量吗?

在 Go 中,当使用命名返回值时,可以使用 defer 语句在返回值之前修改它们。但是,在函数文本中使用局部变量时,这种行为并不一致。

考虑以下代码:

<code class="go">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 设置为 -1 并将 err 设置为 a从恐慌中恢复后的自定义错误消息。但是,如果我们在函数文字中使用局部变量,行为会发生变化:

<code class="go">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>

在这种情况下,结果将重置为 0 而不是 -1。这是因为函数文字中的 defer 语句无法访问或修改指定的返回值,因为它们不再在范围内。

根据 Go 文档,“...如果延迟函数是函数文字并且周围函数具有在文字范围内的命名结果参数,延迟函数可以在返回结果参数之前访问和修改结果参数。”

因此,在尝试时使用命名返回值至关重要使用函数文字中的 defer 语句修改它们。这种情况下的局部变量无法访问或修改。

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

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