我的印象是,尽管语法上存在差异,但下面的函数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
}发布于 2016-03-11 23:15:38
赋值可以被认为是一种“原子”操作。也就是说,认为=左侧的所有值都是“冻结”的,直到所有操作都完成为止,这是很有用的。
考虑以下方案:
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,这可能不是您期望的代码。对这种“冻结”行为的语义进行推理也可能比采用“级联”方法更容易。
发布于 2016-03-11 23:05:02
Go程序设计语言规范 作业 左边的操作数必须等于右边的表达式数,每个表达式必须是单值的,右边的第n个表达式分配给左边的第n个操作数: 一,二,三=‘一’,‘二’,‘三’ 空白标识符提供了一种在赋值中忽略右侧值的方法: _=x //计算x但忽略它x,_= f() //计算f()但忽略第二个结果值 这项工作分两个阶段进行。首先,左边的索引表达式和指针间接的操作数(包括选择器中的隐式指针)和右边的表达式都按照通常的顺序计算。第二,作业从左到右依次进行.
元组分配是两个阶段的分配。首先,左边的索引表达式和指针间接的操作数(包括选择器中的隐式指针)和右边的表达式都按照通常的顺序计算。第二,作业从左到右依次进行.
例如,
package main
import "fmt"
func a() (int, int, int) {
x := 1
y := 2
z := 3
// phase 1
tx := x
ty := y
// phase 2
z = tx
x = ty
y = tx + ty
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())
fmt.Println(b())
}输出:
2 3 1
2 3 1发布于 2016-03-11 23:08:17
简单的答案是,因为它都是一条语句,而且在计算y时,x+y的值还没有更新到2。在任何赋值之前,对右手边的表达式进行评估。在另一种情况下,每件事情都是一次同步发生的,因此ofc y的值已经更新为2,您将得到4个。
有趣的问题,为了学术目的,可怕的代码在现实生活中,所以请不要写这样的东西在一个真正的程序。
https://stackoverflow.com/questions/35951423
复制相似问题