defer

defer & panic & recover - 图1

panic & recover

  1. type _panic struct {
  2. argp unsafe.Pointer
  3. arg interface{} // 调用 panic 传入的参数
  4. link *_panic // 组成了一条链表,支持嵌套 panic。
  5. recovered bool // 是否被 recover
  6. aborted bool // panic 是否被强行终止
  7. pc uintptr
  8. sp unsafe.Pointer
  9. goexit bool
  10. }

defer & panic & recover - 图2

  1. 如果没有对 panic 进行 recover,那么整个程序将崩溃停止!底层 panic 退出程序最终也是通过 runtime.exit 实现的。
  2. 一个协程对 panic 进行恢复后就会退出该协程,不影响其他协程执行,底层通过 runtime.Goexit 退出当前 panic 的 goroutine 而不影响其他的 goroutine。
  3. panic 的跨协程失效意味着一个协程不能捕获其他协程的 panic,只能由发生 panic 的 goroutine 来进行 recover,因为底层 recover 的时机是,当 goroutine 发生 panic 后会调用当前 goroutine 的 defer 函数执行,也正因如此,recover 必须写在 defer 中才有效。