面试题答案
一键面试实现思路
- 在每个可能发生
panic
的goroutine
中使用defer
关键字配合recover
函数。defer
会在函数返回或panic
时执行,recover
函数用于捕获panic
并返回panic
的值。 - 捕获到
panic
后,通过通道(channel
)将panic
的值传递给主goroutine
进行处理。
示例代码
package main
import (
"fmt"
)
func main() {
panicChan := make(chan interface{})
go func() {
defer func() {
if r := recover(); r != nil {
panicChan <- r
}
}()
// 模拟可能发生 panic 的操作
panic("发生了一个 panic")
}()
select {
case p := <-panicChan:
fmt.Printf("主 goroutine 捕获到 panic: %v\n", p)
}
}
在上述代码中:
- 首先创建了一个无缓冲通道
panicChan
用于传递panic
值。 - 在
goroutine
内部使用defer
函数配合recover
捕获panic
,如果捕获到panic
,则将其发送到panicChan
通道。 - 在主
goroutine
中通过select
语句从panicChan
通道接收panic
值并进行处理。