golang关于panic的解析

本文详细解析了Golang中panic的执行机制和顺序,通过多个例子展示了不同情况下panic如何与defer联动。内容包括panic的结构、defer列表的执行、panic如何触发defer、defer中出现panic的处理以及recover的使用。文章强调了panic、defer和recover三者间的相互作用,并探讨了当panic的recovered和aborted同时为true时的情况。
摘要由CSDN通过智能技术生成

panic解析:

关于panic,接下来主要讲panic的执行机制和顺序,我会通过多个例子来讲解不同情况下panic逻辑的处理流程。

首先这是panic的结构体
在这里插入图片描述

与defer是相辅相成的:

首先,通过上一节defer的讲解我们知道,多个defer组成列表挂在当前协程goroutine的成员变量_defer字段下的。
同理在goroutine结构体上还有个字段是用来挂接多个_panic结构体的。
在这里插入图片描述

panic与defer的联动

简单例子
func deferA(){
   
}
//伪代码
func main(){
   
	defer deferA()
	panic("MAIN")	
}
  • 先向当前协程的_defer字段上挂接defer
    在这里插入图片描述
  • 遇到panic,此时向协程的panic字段挂接panic
  • 因为遇到了panic,所以程序停止,从而触发panic,而panic也会触发defer方法。
    首先我们可以看下_defer结构体:
type _defer struct {
   
	siz int32
	started bool //1、panic执行defer,会先将defer的started置为true
	sp uintptr
	pc uintptr
	fn *funcval
	_panic *panic// 2、panic字段指向当前执行的panic
	link *_defer
}

且panic触发了defer方法,所以对应
_deferA.started=true,
_deferA._panic=panicMAIN
如图
在这里插入图片描述

  • 最终deferA执行完毕且deferA节点被移除后,协程输出panicMAIN信息。
    要明确的是,defer执行完后,所有在panic链表上的项都会被输出,顺序于panic发生的顺序一致。
例子二

承接例子一,如果增加一个defer

func deferA(){
   
}
func deferB(){
   
}
//伪代码
func main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值