defer的坑與return的理解

defer會常常用到,可是這個坑對於我並不會踩到,由於我一般不會用到命名返回參數,一則沒有多少必要,二則增長了代碼閱讀難度。不過,這個坑能讓人很好地理解return這個關鍵字,因此在此記錄下。函數

func test() (res int) {
    res = 1
    defer func() {
        res++
    }()
    return 0
}

默默在內心運行這個程序,第一個返回值應該是0嘛,其實否則,return並非個原子操做。分爲了,賦值和返回兩個操做,<return 0>實際上是等價於<res = 0, return res>,而defer是在賦值操做後執行的,因此這個函數等價於:code

func test() (res int) {
    res = 1    
    res = 0    //賦值
    func() {
        res++    //defer
    }()
    return res //返回
}

再來看個例子:test

func test() (res int) {
    tmp := 1
    defer func() {
        tmp++
    }()
    return tmp
}

按剛纔的經驗分析下這個程序,tmp=1,而後返回前又加了1,應該是2吧。其實又錯了,注意返回值命名是res,而不是tmp,defer改變的只能是tmp。這個函數能夠等價於:程序

func test() (res int) {
    tmp := 1
    res = tmp
    func() {
        tmp++
    }()
    return 
}

結果應該是1。經驗

相關文章
相關標籤/搜索