Golang 中 panic 和 recover 的原理是什么?

Golang 中 panic 和 recover 的实现原理如下:
一、panic
panic用于在运行时终止当前Goroutine的执行,抛出一个异常:

panic(error)

调用panic后:

  • 当前Goroutine停止执行
  • 执行defer语句
  • 如果defer语句里也有panic,向上传播
  • 否则退出Goroutine

二、 recover
recover用于捕获panic。只能在defer调用中使用:

if err := recover(); err != nil {
    // 处理panic
}

三、原理
panic和recover的原理是:

  • 当Goroutine抛出panic后,会从当前frame开始,向上回溯寻找recover
  • 第一个遇到的defer frame,如果有recover,就捕获该panic
  • 否则继续向上回溯,传播给caller
  • 如果到达mainframe还没有找到,程序崩溃

四、注意

  • recover只能捕获当前Goroutine的panic
  • 调用一次recover后,后续的panic不起作用

总的来说,panic和recover的原理是:

  1. panic用于当前Goroutine抛出异常
  2. recover用于在defer中捕获异常
  3. panic会向上回溯寻找recover
  4. 第一个recover捕获panic后返回
  5. 否则panic继续向上传播
  6. recover只能捕获当前Goroutine的panic
  7. 调用一次recover后后续panic不起作用

通过这个机制,实现了异常捕获和传播的功能。帮助解决Goroutine间的错误处理问题。