2017-09-01 40 views
-1

我写了如下代码在golang,我推迟函数返回功能,什么是

package main 

import "fmt" 

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

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

} 

,我除了输出AAAA开始结束

,但实际输出顺序开始AAAA结束

我不明白为什么输出 “AAAA” 之前 “启动”

+0

您正在调用被调用的'func()func()'并返回'defer'调用的'func()'。在结尾'}()()'看到双parens。你打电话给第一个,“延期”被告知叫第二个从第一个返回。 – RayfenWindspear

回答

2

specification says

每次执行“延迟”语句时,调用的函数值和参数都照常计算并重新保存,但实际函数未被调用。

延迟函数调用是延迟语句中的最后一个()。返回函数值的表达式在延迟语句时进行评估。

0

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

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