
go 语言中 defer 和 recover 的神奇作用
在 go 语言中,以下程序为什么最终会输出 0 呢?
package main
import (
"fmt"
"errors"
)
func foo() {
panic(errors.New("bug"))
return
}
func test() (result int) {
defer func() {
if r := recover(); r != nil {
err := r.(error)
fmt.Println("catch error", err) // catch error bug
}
}()
foo()
return 100
}
func main() {
fmt.Println(test()) // 0
}答案解析:
当 go 语言遇到 panic 时,会立即执行 defer 函数。在 defer 函数中,如果遇到 recover,则会忽略异常,继续执行 defer 之后的代码。
关键在于 test 函数有一个 int 类型的返回值,这个返回值会在调用时初始化为 0。在 defer 函数中,可以修改这个返回值。如果我们在 defer 函数的最后添加一句 result = 1,那么程序输出将是 1,而不是 0。
因此,由于 defer 函数中的 recover 忽略了 panic 异常,导致 test 函数没有正常返回 100,而是返回了默认值 0。
以上就是Go 语言中 defer 和 recover 的奇妙配合:为什么程序最终输出 0?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号