我的印象是,尽管语法有所不同,但下面的函数a和b在逻辑上是等效的。但是,它们不是,我也不了解它们之间的区别。
在我看来,他们俩都在分配:
有人能帮助消除我对多变量分配以及函数a和函数b之间的逻辑差异的误解吗?
package main import "fmt" func a() (int, int, int) { x:=1 y:=2 z:=3 z = x x = y y = x+y return x, y, z } func b() (int, int, int) { x:=1 y:=2 z:=3 z, x, y = x, y, x+y return x, y, z } func main() { fmt.Println(a()) // prints 2 4 1 fmt.Println(b()) // prints 2 3 1 }
分配可以认为是“原子”操作。也就是说,认为在所有=操作完成之前,“ 左侧”的所有值都是“冻结”的,这很有用。
=
考虑以下程序:
package main import "fmt" func swap() (int, int) { x := 1 y := 2 x, y = y, x return x, y } func main() { fmt.Println(swap()) // prints 2 1 }
如果没有这种“冻结”的行为,你会得到2两个x和y,这 可能 不是你从代码中会发生什么。它也 可能是 理智关于这个“冻结”的行为比如果“级联”的方式采取的语义更容易。
2
x
y