如何在go lang中评估声明和初始化的简写?

Amo*_*rni 6 go

go中声明和初始化的简写是

var a, b, c = 1 , 2, 3 
Run Code Online (Sandbox Code Playgroud)

相当于以下声明和初始化方式(根据规格)

  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) 

}
Run Code Online (Sandbox Code Playgroud)

输出应该是:

printing a after 'a, b = b, a+b' 1 
printing b after 'a, b = b, a+b' 2 
Run Code Online (Sandbox Code Playgroud)

由于b使用a + bie 1+1= 2 评估值,但它给出1.

这是工作代码的操场链接,您可以在其中观察差异.

我知道我遗漏了一些要理解的东西,基本上是如何评估简写表达式,特别是当表达式中涉及相同的变量时.

但是哪里有适当的文件可供参考.有人可以帮忙吗?

Iam*_*NaN 6

看到这里

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

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