面试题答案
一键面试- 使用
defer
和recover
捕获和处理panic
的原理:defer
语句用于延迟函数的执行,通常在函数结束时执行。在goroutine
中,可以使用defer
来注册一个函数,这个函数将在goroutine
结束时执行。recover
函数用于在defer
函数中捕获panic
。当panic
发生时,程序的正常执行流程被中断,但是如果在defer
函数中调用recover
,可以捕获到这个panic
并恢复程序的正常执行。
- 示例代码:
package main
import (
"fmt"
)
func worker() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
// 模拟一个可能导致panic的操作
panic("This is a test panic")
}
func main() {
go worker()
// 防止主程序退出太快
select {}
}
在上述代码中:
worker
函数中使用defer
注册了一个匿名函数。在这个匿名函数中,使用recover
来捕获可能发生的panic
。如果捕获到panic
,会打印出恢复的信息。main
函数中启动了worker
这个goroutine
,并使用select {}
来防止主程序过早退出,以便观察到worker
函数中panic
被捕获的效果。