前言
刚接触到defer的时候感觉和java的finally有点像,就是在return之前执行,但是其实defer比finally强大多了
defer后面只能跟函数【匿名函数也可】
多个defer执行时按栈结构执行 先定义defer的后执行
defer初始化
func f1() int {
var i int
defer func() {
i ++
}()
defer func() {
i ++
}()
return i
}
上面函数会返回啥?可能大多数人觉得会返回2
其实返回的是 0
原因就在于return会先把返回值赋值了再执行defer的函数体
所以上面先是返回值=0 然后i++ i++
改成下面的代码就返回2 了
func f2() (i int) {
defer func() {
i ++
}()
defer func() {
i ++
}()
return
} 因为返回值已经初始化了 defer执行的 i 就是返回值定义的 i
再来看下面的代码
//defer初始化值和位置有关 推迟执行的仅仅是函数体
func f3(j int) (i int) {
defer func(a int) {
i += a
}(j)
defer func(a int) {
i +=a
}(j)
j =88 //defer初始化值和位置有关
return
}
func f4(j int) (i int) {
j =88 //defer初始化值和位置有关
defer func(a int) {
i += a
}(j)
defer func(a int) {
i +=a
}(j)
return
}
func main() {
println(f3(10),f4(10))
} f3会返回啥 ?
答案是f3返回了 20 f4返回了 176
所以defer函数的参数的初始化是会先按代码顺序计算的
defer延迟的仅仅是函数体 其它并没有延迟



京公网安备 11010502036488号