左侧没有新变量:=

Run*_*nes 91 variables go colon-equals

这里发生了什么事?

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) ;

}
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误

no new variables on left side of :=
Run Code Online (Sandbox Code Playgroud)

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

Yog*_*ngh 120

colon :为现有变量分配新值时,从第二个语句中删除.

myArray = [...]int{11,12,14}
Run Code Online (Sandbox Code Playgroud)

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


Mih*_*der 26

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

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

  • 并且 `:=` 不能与 `_` 一起使用?例如 `_ := someFunc()` (4认同)

小智 6

myArray  :=[...]int{12,14,26}
Run Code Online (Sandbox Code Playgroud)

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

所以在上面的陈述中你做了两件事.

  1. 声明您的变量是myArray.
  2. 您正在为myArray变量分配一个整数数组.

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

myArray  :=[...]int{11,12,14} //error pointing on this line 
Run Code Online (Sandbox Code Playgroud)

是重新声明现有变量myArray,它已经包含整数值.

这有效:

myArray = [...]int{11,12,14} //error pointing on this line
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

引用语言规范:

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

package main

import "fmt"


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

    fmt.Println(a, b, c)
}
Run Code Online (Sandbox Code Playgroud)

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