使用局部变量进行紧急恢复
在 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中文网其他相关文章!