面试题答案
一键面试在Go语言中,要确保某个goroutine发生panic时整个程序不崩溃,且能正确处理该panic并清理相关资源,可以使用recover
函数。recover
函数只能在defer
函数中使用,用于捕获当前goroutine的panic并恢复正常执行。
实现思路
- 在可能发生panic的goroutine中,使用
defer
语句注册一个函数。 - 在这个
defer
函数中,使用recover
函数捕获panic。 - 如果捕获到panic,可以进行资源清理操作,并记录错误信息,避免程序崩溃。
示例代码
package main
import (
"fmt"
)
// cleanup 模拟资源清理函数
func cleanup() {
fmt.Println("Cleaning up resources...")
}
// worker 模拟工作的goroutine
func worker() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("Recovered from panic: %v\n", r)
cleanup()
}
}()
// 模拟可能发生panic的操作
panic("Something went wrong!")
}
func main() {
go worker()
// 防止主程序退出
select {}
}
在上述示例代码中:
worker
函数是一个模拟工作的goroutine。- 在
worker
函数内部,通过defer
注册了一个匿名函数,在这个匿名函数中使用recover
捕获可能发生的panic。 - 如果捕获到panic,打印出panic信息,并调用
cleanup
函数清理资源。 - 在
main
函数中启动worker
这个goroutine,并使用select {}
防止主程序退出。这样,即使worker
goroutine发生panic,整个程序也不会崩溃,并且能正确处理panic并清理相关资源。