Go 我延迟一个函数返回函数,顺序是什么
我写下面的代码Go 我延迟一个函数返回函数,顺序是什么,go,Go,我写下面的代码 package main import "fmt" func main() { defer func() func() { fmt.Println("start") return func() { fmt.Println("end") } }()() fmt.Println("aaaa") return } 而我除了输出是aaaa开始结束 但实际输出是从开始到结束 我
package main
import "fmt"
func main() {
defer func() func() {
fmt.Println("start")
return func() {
fmt.Println("end")
}
}()()
fmt.Println("aaaa")
return
}
而我除了输出是aaaa开始结束
但实际输出是从开始到结束
我不明白为什么在“aaaa”之前输出“start”:
每次执行“defer”语句时,调用的函数值和参数都会像往常一样求值并重新保存,但不会调用实际函数
延迟函数调用是延迟语句中的最后一个()
。返回函数值的表达式在DEBER语句时进行求值。
每次执行“defer”语句时,调用的函数值和参数都会像往常一样求值并重新保存,但不会调用实际函数
延迟函数调用是延迟语句中的最后一个
()
。返回函数值的表达式在DEBER语句时求值。由于DEBER语句需要求值语句,因此在代码中,func()(“DEBER”关键字后面的func()返回函数类型,DEBER语句需要实际执行func()以获取返回函数。所以你的代码先打印“开始”
如果函数未返回函数类型,则函数体将不会执行,直到封闭函数返回。由于DEPER语句需要对语句求值,因此在代码中,func()(“DEPER”关键字后面的func()返回函数类型,DEPER语句需要实际执行func()获取返回函数。所以你的代码先打印“开始”
如果函数未返回函数类型,则函数体将不会执行,直到封闭函数返回。您正在调用调用的
func()func()
,并返回调用的func()
。请参见末尾的双参数}()
。在调用第一个函数时,defer
被告知调用从第一个函数返回的第二个函数。您正在调用被调用的func()func()
,并返回正在调用的func()
。请参见末尾的双参数}()
。您正在调用第一个,defer
被告知调用第一个返回的第二个。