对于golang的defer,咱们已经知道,defer定义的语句能够延后到函数返回时执行。golang
常常用在文件的关闭,锁的释放等场景中。并且defer定义的语句即便遇到panic也会执行。这样,能够执行必要的清理工做,甚至使用recover()
捕获异常。函数
之前使用defer常常这样用:code
defer close()
或者get
defer func(){ //do something... }()
本文介绍defer使用函数返回值(也是函数)做为延后执行内容时的状况。string
请看例子代码:it
package main import ( "fmt" ) func main(){ a() } func a() { defer b()() fmt.Println("a...") } func b() func() { fmt.Println("b...") return func(){ fmt.Println("last...") } }
这个例子很简单,只有几行代码。io
对于defer的认识,ast
之前的误解是:
defer b()()
中的b()
也是延后执行的。class
而实际状况是:
执行defer b()()
语句时,会去执行b()
, 而b()
返回的函数延后执行。import
输出的结果是:
b... a... last...
这种用法已经在《Go语言圣经》中提到,具体例子代码以下:
//gopl.io/ch5/trace 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() { start := time.Now() log.Printf("enter %s", msg) return func() { log.Printf("exit %s (%s)", msg,time.Since(start)) } }
defer定义时,开始计时,等bigSlowOperation
结束时,执行延后函数,计算执行的耗时。