这里发生了什么?
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 :=
我正在做的是将值重新分配给已声明的变量。
答案 0 :(得分:111)
在为现有变量分配新值时,从第二个语句中删除colon :
。
myArray = [...]int{11,12,14}
第一次执行简短声明和作业时使用 colon :
,就像您在第一个声明中所做的那样myArray :=[...]int{12,14,26}
。
答案 1 :(得分:25)
转发:=
和=
中有两种类型的赋值运算符。它们在语义上是等价的(关于赋值),但第一个也是“短变量声明”(http://golang.org/ref/spec#Short_variable_declarations),这意味着在左边我们需要至少有一个新的变量声明才能正确
您可以将第二个更改为简单的作业声明:=
- > =
或者您可以使用新变量,如果您的算法没问题。
答案 2 :(得分:6)
myArray :=[...]int{12,14,26}
如前评论者所述, :=
是一种简短形式和/或简短形式的变量声明。
所以在上面的陈述中你做了两件事。
代码的第二部分失败了,因为你在这里做的是:
myArray :=[...]int{11,12,14} //error pointing on this line
重新声明现有变量myArray,它已包含整数值。
这有效:
myArray = [...]int{11,12,14} //error pointing on this line
因为,将整数数组分配给现有(预先声明/初始化)变量。
答案 3 :(得分:3)
作为旁注,重新声明只能出现在多变量简短声明中
引用语言规范:
与常规变量声明不同,短变量声明可以 重新声明变量,只要它们最初是在早些时候宣布的 具有相同类型的相同块,以及至少一个非空白块 变量是新的。因此,重新声明只能出现在 多变量简短声明。重新申报不会引入 新变量;它只是为原始版本赋予了一个新值。
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