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


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
ルー氏

回答:


138

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

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

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


26

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

2番目を単純な代入ステートメントに変更することができます:=-> =または、アルゴリズムに問題がなければ、新しい変数を使用できます。


:=一緒に使用できません_か?例_ := someFunc()
stt106

7

補足として、再宣言は多変数の短い宣言でのみ使用できます

言語仕様からの引用:

通常の変数宣言とは異なり、短い変数宣言は、同じブロック内で同じ型を使用して最初に宣言された変数を再宣言する場合があり、非空白変数の少なくとも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


メモありがとうございます。多変数の短い宣言で混乱しましたが、これが理由を説明しています。
Li Jinyao

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

前のコメントで述べたように、 :=は一種の短縮形および/または変数宣言の短縮形です。

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

  1. 変数をmyArrayとして宣言しています。
  2. あなたはしているの割り当てに整数の配列をMyArrayという変数。

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

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

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

これは機能します:

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

それは、整数配列を既存の(事前宣言/初期化された)変数に割り当てているからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.