紧急恢复可以修改函数文字中的局部变量吗?
在 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中文网其他相关文章!