当函数体内有多个defer时:
    image.png

    defer的一些坑:

    1. package main
    2. import "fmt"
    3. func main() {
    4. defer addAndPrint(addAndPrint(1,2),3)
    5. defer addAndPrint(addAndPrint(4,5),6)
    6. }
    7. func addAndPrint(a,b int) (sum int) {
    8. sum = a+b
    9. fmt.Printf("%d + %d = %d\n",a,b,sum)
    10. return sum
    11. }

    一开始我心算了下结果:
    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)

    image.png