golang中的defer函数的执行顺序

测试代码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)
	}
}

你可能感兴趣的:(golang)