golang defer用法
func main() {
bigSlowOperation()
}
func bigSlowOperation() {
defer trace("bigSlowOperation")() // don't forget the extra parentheses
// ...lots of work...
time.Sleep(1 * time.Second) // simulate slow
//operation by sleeping
}
func trace(msg string) func() {
start := time.Now()
log.Printf("enter %s", msg)
return func() {
log.Printf("exit %s (%s)", msg,time.Since(start))
}
}
上述代码执行的结果是
2021/07/20 21:48:44 enter bigSlowOperation
2021/07/20 21:48:45 exit bigSlowOperation (1.0313889s)
问题:defer后面的函数不是延迟执行吗 为啥先执行trace(“bigSlowOperation”)?
个人理解:你可以试验一下,defer后面的表达式有返回是
匿名函数
与返回的是常规变量
或者什么也不返回
,执行的情况是不一样的。只有
返回的是常规变量
或者什么也不返回
符合defer的完全延迟执行的特性,defer延迟执行的是这个函数体。defer后面的表达式如果再返回一个匿名函数的话,return的这个匿名函数体是被延迟执行的,但这个表达式内的return之前的变量等会被立即调用。贴一个链接你看看:mp.weixin.qq.com/s/5xeAOYi3OoxCEPe...