说明:
Go语言中函数的return不是原子操作, 在底层分为两步来执行;
第一步: 返回值赋值
第二步: 真正的return返回
函数中如果存在defer, 那么defer执行的时机是在第一步和第二步之间;
例子1: func f1() int { x := 5 defer func(){ x++ }() return x } //return: //第一步: 将x赋值给匿名返回变量ret //进行defer操作, 修改x的值, x不是真正的返回值 //第二步: 返回匿名变量ret //输出为:5 例子2: func f2()(x int){ defer func(){ x++ }() return 5 } //返回变量为x //return: //第一步: 给x变量赋值5 x = 5 //defer操作, 修改x的值 x = 6 //第二步: 返回变量x //输出: 6 例子3: func f3()(y int){ x := 5 defer func(){ x++ }() return x } //return: //第一步: 给返回变量y赋值 y = x = 5 //defer: 修改x的值, x = 6 //第二步: 返回变量y y = 5 例子4: func f4(x int){ defer()(x int){ x++ }(x) return 5 } //return: //第一步: 给返回变量x赋值 x = 5 //defer: 将x传入defer 是值传递 修改copy后的x的值 x` = 6 x = 5 //第二步: 返回变量x x = 5 //输出: 5