关于defer的问题

stevenlee87
  • 36
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
}

按照改写规则是将return语句分开成两句写,return xxx会被改写成:
返回值 = xxx
调用defer函数
空的return

i=0
返回值r = i(i等于0)
i=1
i++(i等于2)
return r(我觉得应该是0啊)

结果为什么是2呢?

评论
阅读 624
2 个回答
✓ 已被采纳

不懂go 但是看一下defer 函数
难道不是这样执行的

fun f6() int {
    var i int = 0
    i = 1
    i++
    // 本质原因是return xxx语句并不是一条原子指令
    // defer被插入到了赋值 与 RET之前,因此可能有机会改变最终的返回值。
    r = i
    func(a int) {
         fmt.Println("i f6:", a)
         i = i+5
    }(i)
    return
}

所以

return i 是单指令多操作 就是
在return i这句代码 改为 r = i; return,
但是defer 函数 会被到 了 赋值 和 返回之间,你这个函数也没影响 外作用域 i 的数值
所以返回肯定是2,不是 0 啊
肯定不是提前 把 i变为r,那样也不符合逻辑

我也是go初学者,我是这样理解的

`

func f6() int {  // fun ==> func 你写错了
    var i int = 0
    defer func(a int) {  //延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用
        fmt.Println("i f6:", a)   // a = i = 0 print 0
        i = i+5
    }(i)
    i = 1     
    i++   // i = 2
    return i  // return 2
}

`

宣传栏