defer
panic & recover
type _panic struct {
argp unsafe.Pointer
arg interface{} // 调用 panic 传入的参数
link *_panic // 组成了一条链表,支持嵌套 panic。
recovered bool // 是否被 recover
aborted bool // panic 是否被强行终止
pc uintptr
sp unsafe.Pointer
goexit bool
}
- 如果没有对 panic 进行 recover,那么整个程序将崩溃停止!底层 panic 退出程序最终也是通过 runtime.exit 实现的。
- 一个协程对 panic 进行恢复后就会退出该协程,不影响其他协程执行,底层通过 runtime.Goexit 退出当前 panic 的 goroutine 而不影响其他的 goroutine。
- panic 的跨协程失效意味着一个协程不能捕获其他协程的 panic,只能由发生 panic 的 goroutine 来进行 recover,因为底层 recover 的时机是,当 goroutine 发生 panic 后会调用当前 goroutine 的 defer 函数执行,也正因如此,recover 必须写在 defer 中才有效。