本文已参加「新人创作礼」活动,一起开启掘金创作之路。
今天遇到一个问题,记录一下,直接上代码
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