面试题答案
一键面试panic与recover机制的基本工作原理
- panic:当Go语言程序遇到不可恢复的错误时,会引发
panic
。panic
会导致当前函数立即停止执行,并且开始展开(unwind)调用栈,即依次调用调用栈中每个函数的defer语句。如果在展开过程中没有遇到recover
,程序最终会崩溃并打印出栈跟踪信息,这些信息有助于定位错误发生的位置。 - recover:
recover
是一个内置函数,只能在defer函数中使用。当recover
被调用时,如果当前的goroutine处于panic
状态,它会捕获到panic
时传入的参数,停止panic
的展开过程,使程序可以继续正常执行。如果当前goroutine没有处于panic
状态,recover
会返回nil
。
在简单并发函数中使用recover捕获可能发生的panic示例
package main
import (
"fmt"
)
func worker() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
// 模拟一个会导致panic的操作
panic("Something went wrong")
}
func main() {
go worker()
// 防止主函数退出太快
select {}
}
在上述示例中,worker
函数内部定义了一个defer函数,其中使用recover
来捕获可能发生的panic
。当worker
函数执行panic("Something went wrong")
时,panic
发生,程序开始展开调用栈,此时defer函数被执行,recover
捕获到panic
并打印出恢复信息,程序不会崩溃。main
函数中启动了worker
的goroutine,并使用select {}
防止主函数过早退出,以便观察worker
函数中recover
的效果。