defer知识点,为什么f7返回结果为0?

结果为1

func f5() (r int) {
    defer func() {
        r++
    }()
    return 0
}

//结果为0,为什么?

func f7() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return r
}
野生菌
讨论数量: 5

f7 内定义了两个 r 变量。一个是返回值r, 一个是defer func 的参数。这是两个变量不是1个。defer func 内部修改的是参数r不影响外层返回的r。

3周前 评论
yWNN

两个变量的地址不一样,如果想改变得获取外部r的地址。

func f7() (r int) {
    defer func(r *int) {
        *r = *r + 5
    }(&r)
    return r
}
3周前 评论
╰ゝSakura

第一个是因为闭包的用法,所以是1,第二个是因为闭包里面的参数定义了,r其实是值传递进闭包里面,所以外面还是0

3周前 评论

阅读作用域相关知识

3周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!