Go defer,recover;的问题

97 阅读1分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路。

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

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 箭头指错了,应该是defer f() 这个地方出现了问题,因为f 为 nil 在这里插入图片描述

第五步:

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

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

第六步

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

第七步:

执行return,返回 7