Goの:=演算子と=演算子の違い


283

=:=演算子の違いは何ですか?それらの使用例は何ですか?彼らは両方とも任務に思われるのですか?


2
これも参照してくださいGo Variables Visual Guide。それについての記事を書きました。
Inanc Gumus 2017

1
セマンティクス...
JustDave 2018年

たとえば、特定のタイプを使用したい場合はx := uint32(123)機能します。ほとんどの人にとってそれは明白なはずですが、私は数分考えなければなりませんでした;-)
野口健二

回答:


198

=代入演算子だけです。

:=Short変数宣言句の構文の一部です。

thoughただし、いくつかのルールがあります。詳細については、この別の回答を参照してください。


それは推論された型を持つ変数を意味しますか?正しい?
クルパルシャー2016

@KrupalShahのドキュメントへのリンクは、文字通り、「これは、イニシャライザ式を使用するが、タイプを指定しない通常の変数宣言の省略形です。」golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
:=演算子としてここにリストされているように見えますgolang.org/ref/spec#Operators_and_punctuation、「:=実際には演算子ではない」
Powers

347

Goでは:=、宣言+割り当て=用ですが、割り当てのみです。

たとえばvar foo int = 10 、はと同じfoo := 10です。


4
とは=対照的なユースケースはあり:=ますか?あなたはいつもいつも使うべきです:=か?
ケニーワーデン2017

3
@KennethWorden Go :=では、一度に複数の変数に割り当てており、それらの変数の少なくとも1つが新しいものでない限り、すでに宣言されている変数に割り当てることはできません。
ケニーバニア2017

5
これintは必須でvar foo = 10はありません。同じですfoo := 10
ゲイリーリン

@KennyWorden、はい。関数の外では:=を使用できません。
Karuhanga

105

他の人がすでに説明したよう:=に、宣言、割り当て、および再宣言の両方のためです。変数の型を自動的に推測(推測)します。

たとえば、foo := 32は以下の省略形です。

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ *いくつかのルールがあります:* /

★第1規則:

:=からは使用できませんfuncs。これは、すべてのfuncのうち、ステートメントはキーワードで始まる必要があるためです。

// no keywords below, illegal.
illegal := 42

// `var` keyword makes this statement legal.
var legal = 42

func foo() {
  alsoLegal := 42
  // reason: it's in a func scope.
}

★第2規則:

それらを2回(同じスコープ内で)使用することはできません。

legal := 42
legal := 42 // <-- error

「新しい変数」が:=導入されるため、2回使用しても2番目の変数が再宣言されないため、これは違法です。


★3番目のルール:

これらを多変数の宣言と代入に使用できます。

foo, bar   := 42, 314
jazz, bazz := 22, 7

★4番目のルール(再宣言):

変数の1つが新しい場合は「複数変数」宣言で2回使用できます。

foo, bar  := someFunc()
foo, jazz := someFunc()  // <-- jazz is new
baz, foo  := someFunc()  // <-- baz is new

すべての変数を宣言するのではなく、既存の変数に新しい値を再割り当てし、同時に新しい変数を宣言するだけなので、これは合法です。これは再宣言と呼ばれます。


★5番目のルール:

短い宣言を使用して、その変数が同じ名前ですでに宣言されている場合でも、新しいスコープで変数を宣言できます。

var foo int = 34

func some() {
  // because foo here is scoped to some func
  foo := 42  // <-- legal
  foo = 314  // <-- legal
}

funcのスコープfoo := 42で宣言fooしているため、ここでは合法some()です。foo = 314新しい値をに割り当てるだけなので、合法fooです。


★6番目のルール:

:あなたは、のような短い文のブロックに同じ名前を宣言することができるならばためスイッチ

foo := 42
if foo := someFunc(); foo == 314 {
  // foo is scoped to 314 here
  // ...
}
// foo is still 42 here

、そのためfooif foo := ...だけそれに属し、if句とそれは別のスコープにあります。


そのため、一般的なルールとして、使用できる変数を簡単に宣言したい場合:=、または既存の変数を上書きしたいだけの場合は、を使用できます=

参照:


21

:= 宣言の省略形です。

a := 10
b := "gopher"

aとして宣言され、intvalue 10b初期化されます。asは文字列として宣言され、valueで初期化されますgopher

同等のものを使用=すると

var a = 10
var b = "gopher"

=代入演算子です。他の言語で使用するのと同じように使用されます。

変数を宣言し、初期化子が存在する場合は、タイプを省略できます(http://tour.golang.org/#11)。


«=は代入演算子です。他の言語で使用するのと同じように使用されます。» =比較のためで:=あり、割り当てのためのAdaを除いて...
Alexis Wilke


11

:=宣言して割り当てる=だけ

コードをタイプまたは構造体の宣言で埋めたくない場合に便利です。

// Usage with =
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2

// Usage with :=
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)

7

参照ドキュメントから:(tour.golang.org

関数内:=短い代入文は、暗黙的な型とのvar宣言の代わりに使用することができます。

関数の外では、すべての構成要素はキーワード(var、funcなど)で始まり、:=構成要素は使用できません。



2

どちらもGo言語での変数宣言の異なる手法です。

var firstName = "John" // is a variable declaration 

そして

firstName := "John"   // is a short variable declaration. 

短い変数宣言は、初期化子式を含むが型を持たない通常の変数宣言の省略形です。

詳細については以下をお読みください:

変数宣言

短い変数宣言


10
最初の例では構文が間違っていると思います。代わりに:var firstName:= "John"、次のようにする必要があります:var firstName = "John"
Gino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.