2015-04-06 62 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的結果