在golang中,我推迟了函数返回函数,是什么顺序

时间:2017-09-01 16:33:48

标签: go

我写了以下代码

package main

import "fmt"

func main() {
    defer func() func() {
        fmt.Println("start")
        return func() {
            fmt.Println("end")
        }

    }()()
    fmt.Println("aaaa")
    return

}

和我除了输出是aaaa start end

但实际输出是开始aaaa结束

我无法理解为什么在“aaaa”之前输出“start”

2 个答案:

答案 0 :(得分:2)

specification says

  

每次执行“延迟”语句时,将像往常一样评估调用的函数值和参数,并重新保存但不调用实际函数。

延迟函数调用是defer语句中的最后一个()。返回函数值的表达式在defer语句时计算。

答案 1 :(得分:0)

由于defer语句需要评估语句,在你的代码中,func()(紧跟在“defer”关键字后面的func())返回一个函数类型,defer语句需要实际执行func()来获取返回功能。所以你的代码首先打印出“开始”。

如果你的函数没有返回函数类型,那么在封闭函数返回之前不会执行函数体。