今天遇到一个问题,记录一下,直接上代码
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