golang defer 延後執行什麼

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

相關文章
相關標籤/搜索