佛门广大,岂不容一癫僧!

panci结构体源码:

源码地址

参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
type _panic struct {
  argp unsafe.Pointer // 指向defer函数
  arg interface{} // panic时的参数
  link *_panic // 指向之前的panic
  pc uintptr
  sp unsafe.Pointer
  recovered bool           // 表示当前的panic是否被recover恢复
  aborted bool           // 当前panic是否被强行终止
  goexit bool
}

编译过程源码:

1
2
3
4
5
6
func gopanic(e interface{}){
    gp:=getg()
    先处理defer
    
    在处理recover
}

总结:

panic在执行时会首先执行defer.

panic 也是关联在goroutine上的链表

有Recover的情况:

先处理defer,如果有recover,则设置recover的标志位为true

然后panic遇到recover后, 获取pc和栈指针sp, 并调用recover函数

recover函数:恢复pc,sp 等参数,调用gogo(&go.sched)

这里的gogo就是跳转回deferproc,从而回到正常逻辑。