面试题答案
一键面试在Go语言中,可以使用recover
函数来捕获panic
并防止程序崩溃。以下是实现这种机制的方法及示例代码:
- 使用
defer
语句和recover
函数在可能发生panic
的goroutine
内部捕获异常。 - 使用通道(
channel
)将异常信息传递给主goroutine
。
示例代码如下:
package main
import (
"fmt"
)
func main() {
// 创建一个用于传递异常信息的通道
errCh := make(chan interface{})
// 启动一个goroutine
go func() {
defer func() {
if r := recover(); r != nil {
// 将捕获到的异常信息发送到通道
errCh <- r
}
}()
// 模拟可能触发panic的操作
panic("模拟一个panic异常")
}()
// 从通道接收异常信息
for err := range errCh {
fmt.Printf("在主goroutine中捕获到异常: %v\n", err)
// 这里可以进行统一的异常处理,例如记录日志等
close(errCh) // 处理完后关闭通道
}
}
在上述代码中:
defer
语句中的匿名函数会在goroutine
结束时执行,通过recover
函数捕获panic
。- 如果捕获到
panic
,则将异常信息通过errCh
通道发送给主goroutine
。 - 主
goroutine
通过for... range
循环从通道接收异常信息,并进行统一处理。处理完后关闭通道,以避免死锁。