我写了以下代码
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”
答案 0 :(得分:2)
每次执行“延迟”语句时,将像往常一样评估调用的函数值和参数,并重新保存但不调用实际函数。
延迟函数调用是defer语句中的最后一个()
。返回函数值的表达式在defer语句时计算。
答案 1 :(得分:0)
由于defer语句需要评估语句,在你的代码中,func()(紧跟在“defer”关键字后面的func())返回一个函数类型,defer语句需要实际执行func()来获取返回功能。所以你的代码首先打印出“开始”。
如果你的函数没有返回函数类型,那么在封闭函数返回之前不会执行函数体。