golang关于panic的解析

panic解析:关于panic,接下来主要讲panic的执行机制和顺序;与defer是相辅相成的:首先,通过上一节我们知道,多个defer组成列表挂在当前协程的成员变量_defer下的。同理在goroutine结构体上还有个字段是用来挂接多个_panic结构体的。学习时间:提示:这里可以添加计划学习的时间例如:1、 周一至周五晚上 7 点—晚上9点2、 周六上午 9 点-上午 11 点3、 周日下午 3 点-下午 6 点学习产出:提示:这里统计学习计划的总量例如:1、 技术笔记
摘要由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()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值