宣言的简写如何?在go lang中评估初始化?

时间:2015-04-06 11:34:22

标签: go

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

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

  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。

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

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

    但在哪里提供适当的文件。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:6)

请参阅here

  

转让分两个阶段进行。一,索引的操作数   表达式和指针间接(包括隐式指针)   左边的选择器中的间接和)上的表达式   权利都按照通常的顺序进行评估。第二,任务   按从左到右的顺序进行。

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

的结果