golang defer 匿名返回值与具名返回值,为什么不同

匿名返回值 return 0
具名返回值 return 2
为什么?

// 匿名返回值
func test_unnamed()(int) {
    var i int
    defer func() {
        i++
        fmt.Println("defer a:", i)
    }()
    defer func() {
        i++
        fmt.Println("defer b :", i)
    }()
    return i // 0
}

defer b : 1
defer a: 2
return: 0

// 具名返回值
func test_named()(i int) {
    defer func() {
        i++
        fmt.Println("defer c:", i)
    }()
    defer func() {
        i++
        fmt.Println("defer d :", i)
    }()
    return i // 2
}

defer d : 1
defer c: 2
return: 2
阅读 3k
1 个回答
新手上路,请多包涵

匿名返回值,返回值实在return执行时声明的,defer无法访问,等价于return了一个i的值拷贝,defer修改i不影响返回值。具名返回值defer可以直接访问修改。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题