2015-04-06 39 views
6

的声明和初始化中去的速记是如何在lang中评估声明和初始化的速记?

var a, b, c = 1 , 2, 3 

相当于声明和初始化(按specs)的下列方式

  1. a:=1 b:=2 c:=3

  2. 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 + b1+1 = 2,但评估其给予1.

这里是两个工作代码,你可以观察到的区别的操场链接。

我知道我失去了一些东西去理解,尤其是在同一个变量参与表达式速记表达基本上是如何评估的。

但是,哪里是适当的文件来引用。任何人都可以帮忙吗?

回答

6

参见here

在两个阶段中的分配进行。首先,左边的索引 表达式和指针间接(包括隐式指针 在选择器中的间接寻址)操作数和右边的表达式都按照通常的顺序进行评估。其次,作业 按照从左到右的顺序进行。

基于a + b(0 + 1)首先被评估。然后它被分配。因此,你得到a = 1和b = 1的结果