当函数体内有多个defer时:
defer的一些坑:
package main
import "fmt"
func main() {
defer addAndPrint(addAndPrint(1,2),3)
defer addAndPrint(addAndPrint(4,5),6)
}
func addAndPrint(a,b int) (sum int) {
sum = a+b
fmt.Printf("%d + %d = %d\n",a,b,sum)
return sum
}
一开始我心算了下结果:
4+5 = 9
9+6 = 15
1+2 =3
3+3 = 6
结果让我大跌眼镜:
1 + 2 = 3
4 + 5 = 9
9 + 6 = 15
3 + 3 = 6
总结:
虽然main函数有两个defer,一开始我也以为是从下往上执行的,最后发现,当main函数执行时,发现defer1 函数的第一个参数是个函数,所以会先执行这个函数1+2 =3,然后把return 的结果保存下来
然后发现defer2函数的第一个参数也是个函数,因此也先执行这个函数,4+5 = 9。然后保存这个return的值
当发现没有需要被执行的正常函数后,就进行defer逆向的计算规则来计算值:
defer2此时就变成了addAndPrint(9,6)
defer1此是也变成了addAndPrint(3,3)