go中的闭包:命名返回值的不同输出

时间:2017-03-04 19:30:51

标签: go

考虑以下功能:

func main() {
  var a int = 3
  sum := func() {a = a*2}
  sum()
  sum()
  fmt.Println(a) // returns 12
}

然而:

func main() {
  var a int = 3
  sum := func() (a int) {a = a*2; return}
  sum()
  sum()
  fmt.Println(a) // returns 3
}

我无法完全理解这种行为的逻辑:为什么它会在a之后返回a = a*2的旧值

1 个答案:

答案 0 :(得分:0)

就像@TimCooper评论的那样,你正在影响“a”。

如果您运行以下代码,您将看到两个不同的内存地址。

这意味着“2变量a”。

sum()中的“a”表示它自己的返回,并且声明它没有值,因此编译器将“零值”分配给“other a”,即0到数字类型。

因此,a = a * 2等于0 = 0 * 2.

当sum()结束时,它返回“other a”(记住不同的内存地址?),保持“first a”不变。

此链接可能会有所帮助: Go zero values

package main

import "fmt"

func main() {
    var a int = 3
    sum := func() (a int) {
        fmt.Println(&a) // func sum() scope (a's copy memory address)
        a = a * 2
        return
    }
    b := sum()      // initializing b with the sum() return
    fmt.Println(&a) // func main() scope (a's memory address)
    fmt.Println(b)  // func sum() return
    fmt.Println(a)  // old value, stills 3
}