深入理解Golang之defer

(1)鞏固練習:

   看看以下三個函數的返回值:

func f() (result int) { 
    defer func() { 
        result++ 
    }() 
    return 0
}
func f() (r int) { 
    t := 5 
    defer func() { 
        t = t + 5 
    }() 
    return t
}

func f() (r int) { 
    defer func(r int) { 
        r = r + 5 
    }(r) 
    return 1
}

 (2) 首先明確:defer在return之前執行

        整個return過程:

        1.沒有defer之前,先把在棧中寫一個值,這個值被會當作返回值。然後再調用RET指令返回。return xxx語句彙編後是先給返回值賦值,再做一個空的return: ( 賦值指令 + RET指令)

        2.有defer之後,就變成了 (賦值指令 + CALL defer指令 + RET指令),將return語句分開成兩句寫,return xxx會被改寫成:

        返回值 = xxx

        調用defer函數

        空的return

 

(3)分析

     func f() (result int) { 

    result = 0 //return語句不是一條原子調用,return xxx其實是賦值+RET指令 

    func() { //defer被插入到return之前執行,也就是賦返回值和RET指令之間 

        result++ 

    }() 

    return

}

     返回值:1

 

    func f() (r int) { 

    t := 5 

    r = t //賦值指令 

    func() { //defer被插入到賦值與返回之間執行,這個例子中返回值r沒被修改過 

        t = t + 5 

    } 

          return //空的return指令

       }

        返回值:5

 

func f() (r int) { 

    r = 1 //給返回值賦值 

    func(r int) { //這裏改的r是傳值傳進去的r,不會改變要返回的那個r值 

        r = r + 5 

    }(r) 

    return //空的return

}

           返回值:  1

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章