面试题答案
一键面试- 实现思路:
- 在可能发生
panic
的goroutine
中使用defer
语句配合recover
函数。defer
语句会在函数返回或panic
发生时执行,recover
函数可以捕获panic
并使程序恢复正常执行流。 - 可以通过通道(
channel
)将捕获到的panic
信息传递给主goroutine
或其他专门处理错误的goroutine
,进行集中处理。这样既不会导致整个程序崩溃,也能让其他正常的goroutine
继续运行。
- 在可能发生
- 关键代码片段:
package main
import (
"fmt"
)
func main() {
// 创建一个通道用于传递panic信息
panicCh := make(chan interface{})
// 启动一个goroutine
go func() {
defer func() {
if p := recover(); p != nil {
panicCh <- p
}
}()
// 模拟可能发生panic的操作
panic("模拟panic")
}()
// 从通道接收panic信息并处理
go func() {
for p := range panicCh {
fmt.Printf("捕获到panic: %v\n", p)
}
}()
// 模拟其他正常goroutine的工作
go func() {
for {
fmt.Println("其他正常goroutine在工作")
}
}()
// 防止主goroutine退出
select {}
}
在上述代码中:
- 启动的第一个
goroutine
中,使用defer
和recover
捕获panic
,并通过panicCh
通道将panic
信息发送出去。 - 第二个
goroutine
从panicCh
通道接收panic
信息并打印处理。 - 第三个
goroutine
模拟其他正常工作的goroutine
持续运行。 - 主
goroutine
通过select {}
阻塞,防止程序退出。