前言

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