Go defer,recover;的问题

本文通过一个Go语言代码示例,详细解析了defer、return和recover的交互行为。重点讨论了defer的执行顺序、return语句与defer的关系以及recover在捕获panic后的执行流程。在示例中,当函数内部触发panic后,recover捕获了异常并执行了defer函数,最终返回值为7。
摘要由CSDN通过智能技术生成

今天遇到一个问题,记录一下,直接上代码

package main

import "fmt"

func f(n int) (r int) {
	
	defer func() {
		
		r += n
		
		
		recover()
		
	}()
	
	var f func()

	defer f()
	
	f = func() {
		
		r += 2
		
	}
	
	return n + 1
}

func main() {
	fmt.Println(f(3))
}

提问: 输出多少????


差不多了,我们开始解析
先来说答案:7
你算对了没
我们先来看一下知识点,
1.defer 与 return;defer在 return 之前,但是在返回值赋值之后!
2.recover ; defer + recover 我们都知道捕获异常,但是后面还有一句,就是程序会从发成异常的位置退出
3. defer的执行顺序,先进后出,这个估计大家都懂得,就不过多的叙述了;

然后我们来开始解析这个题目

第一步:

在这里插入图片描述

第二步:

执行 第一个defer,押入栈中,defer的执行顺序,先入后出

第三步:

在这里插入图片描述

第四步:出现panic
暂时我没弄清楚 panic的原因,等我补充吧
在这里插入图片描述

第五步:

注意这里只是赋值
在这里插入图片描述
这就是第五步做的操作 r = 3+1

然后,去执行defer
在这里插入图片描述

第六步

执行第一个defer
在这里插入图片描述
r =r+n ; r = 4 + 3; r = 7

第七步:

执行return,返回 7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值