dia*_*e17 4 variable-assignment go
我的印象是,尽管语法有所不同,但下面的函数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
}
Run Code Online (Sandbox Code Playgroud)
分配可以被认为是“原子”操作。也就是说,认为在所有=
操作完成之前,“冻结” 左侧的所有值很有用。
考虑以下程序:
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
}
Run Code Online (Sandbox Code Playgroud)
如果没有这种“冻结”的行为,你会得到2
两个x
和y
,这可能不是你从代码中会发生什么。它也可能是理智关于这个“冻结”的行为比如果“级联”的方式采取的语义更容易。