前言
刚接触到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延迟的仅仅是函数体 其它并没有延迟