對於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
結束時,執行延後函數,計算執行的耗時。