124

这里发生了什么事?

package main

import "fmt"

func main() {

    myArray  :=[...]int{12,14,26}  ;     
    fmt.Println(myArray)

    myArray  :=[...]int{11,12,14} //error pointing on this line 

    fmt.Println(myArray) ;

}

它抛出一个错误,说

no new variables on left side of :=

我正在做的是将值重新分配给已经声明的变量。

4

4 回答 4

162

colon :当您为现有变量分配新值时,请从第二条语句中删除。

myArray = [...]int{11,12,14}

colon :在您第一次执行简短声明和赋值时使用,就像您在第一个语句中所做的那样,即myArray :=[...]int{12,14,26}.

于 2012-11-11T06:48:11.143 回答
27

:=go和中有两种类型的赋值运算符=。它们在语义上是等价的(就赋值而言),但第一个也是“短变量声明”(http://golang.org/ref/spec#Short_variable_declarations),这意味着在左边我们至少需要一个新的变量声明是正确的。

您可以将第二个更改为简单的赋值语句:=->=或者如果您的算法没问题,您可以使用新变量。

于 2012-11-11T07:24:27.630 回答
8

作为旁注,重新声明只能出现在多变量短声明中

引用语言规范:

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块中以相同类型声明的,并且至少有一个非空白变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不引入新变量;它只是为原始值分配一个新值。

package main

import "fmt"


func main() {
    a, b := 1, 2
    c, b := 3, 4

    fmt.Println(a, b, c)
}

这是关于在 golang 中重新声明变量的一个很好的例子: https ://stackoverflow.com/a/27919847/4418897

于 2018-06-13T05:30:45.820 回答
7
myArray  :=[...]int{12,14,26}

正如前面的评论者所说, :=是一种速记和/或变量声明的缩写形式。

因此,在上面的陈述中,您正在做两件事。

  1. 您将变量声明myArray
  2. 您正在一个整数数组分配给myArray变量。

你的代码的第二部分失败了,因为你在这里做什么:

myArray  :=[...]int{11,12,14} //error pointing on this line 

正在重新声明已包含整数值的现有变量 myArray。

这有效:

myArray = [...]int{11,12,14} // NO error will be produced by this line

因为,它将整数数组分配给现有的(预先声明的/初始化的)变量。

于 2012-11-13T00:48:36.043 回答