在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/GO/ 關(guān)于defer的問(wèn)題

關(guān)于defer的問(wèn)題

fun f6() int {
    var i int = 0
    defer func(a int) {
        fmt.Println("i f6:", a)
        i = i+5
    }(i)
    i = 1
    i++
    return i
}

按照改寫(xiě)規(guī)則是將return語(yǔ)句分開(kāi)成兩句寫(xiě),return xxx會(huì)被改寫(xiě)成:
返回值 = xxx
調(diào)用defer函數(shù)
空的return

i=0
返回值r = i(i等于0)
i=1
i++(i等于2)
return r(我覺(jué)得應(yīng)該是0啊)

結(jié)果為什么是2呢?

回答
編輯回答
萌吟

不懂go 但是看一下defer 函數(shù)
難道不是這樣執(zhí)行的

fun f6() int {
    var i int = 0
    i = 1
    i++
    // 本質(zhì)原因是return xxx語(yǔ)句并不是一條原子指令
    // defer被插入到了賦值 與 RET之前,因此可能有機(jī)會(huì)改變最終的返回值。
    r = i
    func(a int) {
         fmt.Println("i f6:", a)
         i = i+5
    }(i)
    return
}

所以

return i 是單指令多操作 就是
在return i這句代碼 改為 r = i; return,
但是defer 函數(shù) 會(huì)被到 了 賦值 和 返回之間,你這個(gè)函數(shù)也沒(méi)影響 外作用域 i 的數(shù)值
所以返回肯定是2,不是 0 啊
肯定不是提前 把 i變?yōu)閞,那樣也不符合邏輯

2018年8月18日 23:13
編輯回答
紓惘

我也是go初學(xué)者,我是這樣理解的

`

func f6() int {  // fun ==> func 你寫(xiě)錯(cuò)了
    var i int = 0
    defer func(a int) {  //延遲調(diào)用的參數(shù)會(huì)立刻生成,但是在上層函數(shù)返回前函數(shù)都不會(huì)被調(diào)用
        fmt.Println("i f6:", a)   // a = i = 0 print 0
        i = i+5
    }(i)
    i = 1     
    i++   // i = 2
    return i  // return 2
}

`

2017年12月8日 15:14