web-dev-qa-db-ja.com

:=の左側に新しい変数はありません

ここで何が起こっていますか?

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

私がやっていたことは、すでに宣言された変数に値を再割り当てすることでした。

86
Runes

既存の変数に新しい値を割り当てるときに、2番目のステートメントからcolon :を削除します。

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

colon :は、最初のステートメントで行うように、最初に短い宣言と割り当てを実行するときに使用されます。つまり、myArray :=[...]int{12,14,26}です。

114
Yogendra Singh

Go :==には、2種類の代入演算子があります。それらは(割り当てに関して)意味的には同等ですが、最初の1つは「短い変数宣言」( http://golang.org/ref/spec#Short_variable_declarations )でもあります。正しくするには、少なくとも新しい変数宣言が必要です。

2番目を単純な割り当てステートメント:=-> =に変更するか、アルゴリズムで問題ない場合は新しい変数を使用できます。

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

前のコメンターが述べたように、:=は、速記のタイプおよび/または変数宣言の短縮形です。

したがって、上記の文では、2つのことを行っています。

  1. 宣言変数はmyArrayになります。
  2. 割り当てmyArray変数への整数の配列です。

コードの2番目の部分は、ここで何をしているのかで失敗します。

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

既に整数値が含まれているexisting変数myArrayをRE宣言しています。

これは動作します:

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

なぜなら、それはassigning既存の(事前宣言/初期化された)変数への整数配列だからです。

6
RobEdouard

補足説明として、再宣言は複数変数の短い宣言でのみ表示できます

言語仕様からの引用:

通常の変数宣言とは異なり、短い変数宣言は、同じタイプの同じブロックで以前に宣言されていて、非空白変数の少なくとも1つが新しい場合、変数を再宣言できます。結果として、再宣言は複数変数の短い宣言でのみ表示されます。再宣言では、新しい変数は導入されません。元の値に新しい値を割り当てるだけです。

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

4
Santosh Pillai