下面这段代码输出什么?
func main() {
a := 1
b := 2
defer calc("1", a, calc("10", a, b))
a = 0
defer calc("2", a, calc("20", a, b))
b = 1
}
func calc(index string, a, b int) int {
ret := a + b
fmt.Println(index, a, b, ret)
return ret
}
下面这段代码输出什么?
func main() {
a := 1
b := 2
defer calc("1", a, calc("10", a, b))
a = 0
defer calc("2", a, calc("20", a, b))
b = 1
}
func calc(index string, a, b int) int {
ret := a + b
fmt.Println(index, a, b, ret)
return ret
}
`单行代码`
打卡
打卡
di
打卡
答案是
我的这个测试代码更能够理解defer的逻辑。
在执行
defer t.Inc(3).Inc(2).Inc(1)
时,从左到右先计算了3
,2
这两个,最后的1
才压栈。根据结果可看到先执行
return t.num
,因为main 2
表示最终返回值是2所以return先执行,然后再执行之前压栈的
defer t.Inc(1)
mark
这个解释的很清楚
:+1:
感谢大佬分享
m
mark
打卡 学废了
mark
10 1 2 3 \n 20 0 2 2 \n 2 0 2 2 \n 1 1 3 4 (golang码农求职)
打卡
第二次打卡
mk
打卡。。。。。。。。。。。。。
学到了
1
defer 执行
mark
m
嵌套函数在defer中的执行顺序
打卡
好麻烦。。
mark defer
make
mark
mark
11111111111111
mark
1
mark
10 1 2 3 被遗漏了。。。
mark
mk
mark
打卡
mark
mark
打卡
mark
mark
题目重复了,和之前的
m
mark
10 1 2 3 20 0 2 2 2 0 2 2 1 1 3 4 程序执行到 main() 函数三行代码的时候,会先执行 calc() 函数的 b 参数,即:calc("10",a,b),输出:10 1 2 3,得到值 3,因为 defer 定义的函数是延迟函数,故 calc("1",1,3) 会被延迟执行;
程序执行到第五行的时候,同样先执行 calc("20",a,b) 输出:20 0 2 2 得到值 2,同样将 calc("2",0,2) 延迟执行;
程序执行到末尾的时候,按照栈先进后出的方式依次执行:calc("2",0,2),calc("1",1,3),则就依次输出:2 0 2 2,1 1 3 4。
mark