:=的左侧没有新变量


104

这里发生了什么事?

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 :=

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


尝试myArray,x = [...]int{11,12,14},3
Lou Lou

Answers:


138

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

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

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


26

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

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


:=不能使用_?例如_ := someFunc()
stt106

7

附带说明一下,重新声明只能出现在多变量简短声明中

引用语言规范:

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

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


感谢您的来信。我对多变量简短声明感到困惑,这解释了原因。
李金耀

7
myArray  :=[...]int{12,14,26}

如先前的评论者所述, :=是一种简写形式和/或变量声明的简写形式。

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

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

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

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

RE声明现有变量myArray,该变量已经包含整数值。

这有效:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.