考虑以下功能:
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
的旧值
答案 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
}