最近学习go语言,也写过不少defer,例如socket通信当成功建立连接后立马来一个defer mSocket.Close()亦或是当http建立连接后来一个defer resp.Close(),go defer的引入简直不要太爽,开发者将资源释放的动作放在defer里面,就再不需要过于关注资源释放的问题了。
defer好用是好用,但最近看《go程序设计语言》一书关于defer这一块的介绍时,书中写了一个demo,用defer实现了进入函数的打印以及出函数的打印和函数花费的时间,现把代码贴出来
package main
import (
"log"
"time"
)
func main(){
bigSlowOperation()
}
func bigSlowOperation() {
defer trace("bigSlowOperation")() // don't forget the extra parentheses
// ...lots of work...
time.Sleep(10 * time.Second) // simulate slow operation by sleeping
}
func trace(msg string) func() {
log.Printf("enter %s", msg)
start := time.Now()
return func() { log.Printf("exit %s (%s)", msg, time.Since(start)) }
}
仔细一看,发现defer后面是一个函数(方法),而且这个函数的返回值也是函数,按照常规的思维方式,defer修饰的代码应该在函数(方法)结