defer准则:
1:后定义的defer先执行(可以理解为栈的方式)
2:defer定义的函数的参数,在定义的时候已经被赋值了
3:defer函数可以修改具名返回值,但不会修改匿名返回值
4:遇到panic的时候,当前协程调用栈已定义的defer将被执行,如果当前协程没有任何一个defer函数内执行了recover,那么将退出进程
例1,如下代码会输出什么?
import "testing"
import "fmt"
func sum(tip string, a int, b int) int {
sum := a + b
fmt.Printf("tip=%s a=%d b=%d sum=%d\n", tip, a, b, sum)
return sum
}
func deferSum() {
a := 1
b := 2
defer sum("1tip", a, sum("2tip", a, b))
a = 3
defer func(b int) {
sum("3tip", a, sum("4tip", a, b))
}(a)
b = 4
defer func() {
sum("5tip", a, sum("6tip", a, b))
}()
}
func TestDeferSum(t *testing.T) {
deferSum()
}
正确答案如下:
tip=6tip a=3 b=4 sum=7
tip=5tip a=3 b=7 sum=10
tip=4tip a=3 b=3 sum=6
tip=3tip a=3 b=6 sum=9
tip=1tip a=1 b=3 sum=4
原文:https://www.cnblogs.com/fitness/p/14046592.html