版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36520153/article/details/82962988
测试代码1
func TestDefer(t *testing.T) {
fmt.Println("a")
defer fmt.Println("b")
defer c()
defer d()
fmt.Println("f")
}
func c() {
fmt.Println("c")
}
func d() func(){
fmt.Println("d")
return func() {
fmt.Println("e")
}
}
输出为 a f d c b
结论:defer函数在函数执行结束后执行,若有多个defer函数,则执行顺序为后进先出
测试代码二:
func TestDefer(t *testing.T) {
fmt.Println("a")
defer fmt.Println("b")
defer c()
defer d()()
fmt.Println("f")
}
func c() {
fmt.Println("c")
}
func d() func(){
fmt.Println("d")
return func() {
fmt.Println("e")
}
}
这段代码只是在调用d方法时加了个括号,那么d方法返回的方法就会立即执行
返回结果为 a d f e c b
我们可以看到 被defer标记的d函数中的程序“立即执行”,而d函数返回的函数则在测试方法结束后 按照“后进先出”的顺序执行。我们可以利用这个特性(函数主体立即执行,返回的函数在主函数结束后执行)做一些功能,如显示函数的执行时间
func Elapsed(funName string) func() {
start := time.Now()
fmt.Println("entered ", funName)
return func() {
duration := time.Since(start)
fmt.Println(funName, " elapsed ", duration)
}
}