go中声明和初始化的简写是
var a, b, c = 1 , 2, 3
相当于以下声明和初始化方式(根据specs)
a:=1
b:=2
c:=3
var a int
var b int
var c int
a=1
b=2
c=3
但我没有得到以下代码中发现的问题的答案:
package main
import "fmt"
func main() {
var a int = 0
var b int = 1
fmt.Println("init a ",a)
fmt.Println("init b ",b)
a, b = b, a+b
fmt.Println("printing a after `a, b = b, a+b`",a)
fmt.Println("printing b after `a, b = b, a+b`",b)
}
输出应为:
printing a after 'a, b = b, a+b' 1
printing b after 'a, b = b, a+b' 2
由于b
的值是使用a + b
进行评估,即1+1
= 2.但是它给出了1。
这是工作代码的操场链接,您可以在其中观察差异。
我知道我遗漏了一些要理解的东西,基本上是如何评估速记表达式,特别是当表达式中涉及相同的变量时。
但在哪里提供适当的文件。有人可以帮忙吗?
答案 0 :(得分:6)
请参阅here
转让分两个阶段进行。一,索引的操作数 表达式和指针间接(包括隐式指针) 左边的选择器中的间接和)上的表达式 权利都按照通常的顺序进行评估。第二,任务 按从左到右的顺序进行。
基于首先评估a + b(0 + 1)。然后分配。因此,您得到a = 1和b = 1
的结果