在 Go 语言的函数中 return 语句在底层并不是原子操作,它分为给返回值赋值和 RET 指令两步
而 defer 语句执行的时机就在放回值赋值操作后,RET 指令执行前
具体如下图所示
5、defer 案例
defer 注册要延迟执行的函数时该函数所有的参数都需要确定其值
package main
import "fmt"
func calc(index string,a,b int) int {
ret := a + b
fmt.PrintIn(indexer,a,b,ret)
return ret
}
func main() {
x := 1
y := 2
defer calc("AA",x,calc("A",x,y))
x = 10
defer calc("BB", x, calc("B", x, y))
y = 20
}
/*
A 1 2 3
B 10 2 12
BB 10 12 22
AA 1 3 4
*/
二、defer 陷阱
1、defer 碰上闭包
也就是说函数正常执行,由于闭包用到的变量 i 在执行的时候已经变成 4,所以输出全都是 4
package main
import "fmt"
func main() {
var whatever [5]struct{}
for i := range whatever {
defer func() { fmt.Println(i) }()
}
}
/*
4
4
4
4
4
*/