聊聊golang的defer

本文主要研究一下golang的defergolang

defer

  • return先賦值(對於命名返回值),而後執行defer,最後函數返回
  • defer函數調用的執行順序與它們分別所屬的defer語句的執行順序相反
  • defer後面的表達式能夠是func或者是method的調用,若是defer的函數爲nil,則會panic

實例

實例1

// f returns 42
func f() (result int) {
    defer func() {
        // result is accessed after it was set to 6 by the return statement
        result *= 7
    }()
    return 6
}
這裏return先給result賦值爲6,以後執行defer,result變爲42,最後返回42

實例2

func f() int {
    result := 6
    defer func() {
        // result is accessed after it was set to 6 by the return statement
        result *= 7
    }()
    return result
}
這裏return肯定返回值6,以後defer修改result,最後函數返回return肯定的返回值

實例3

func multiDefer() {
    for i := 3; i > 0; i-- {
        defer func(n int) {
            fmt.Print(n, " ")
        }(i)
    }

    for i := 3; i > 0; i-- {
        defer fmt.Print(i, " ")
    }
}
多個defer函數,按順序逆序執行,這裏輸出1 2 3

實例4

var fc func() string

func main() {
    fmt.Println("hello")
    defer fc()
}
因爲defer指定的func爲nil,這裏panic

實例5

func main() {
    for i := 3; i > 0; i-- {
        defer func() {
            fmt.Print(i, " ")
        }()
    }
}
因爲defer這裏調用的func沒有參數,等執行的時候,i已經爲0,於是這裏輸出3個0

小結

defer能夠拆解爲return賦值,defer執行,最後代碼返回三步;defer的順序按逆序執行。c#

doc

相關文章
相關標籤/搜索