web-dev-qa-db-ja.com

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

Goでは、=:=演算子の違いは何ですか?彼らは両方とも割り当てのようですか?これは明らかかもしれませんが、ドキュメントで見つけることができないようです。

215
Chris

=のみが割り当て演算子です。

:=は、実際には 演算子 ではありません。これは、 短い変数宣言 句の構文の一部です。

162
zzzz

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

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

235
Chaos

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

次の短縮形です。

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

いくつかのルール

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

illegal := 42

func foo() {
  legal := 42
}

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

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

なぜなら、:= "a new variable"を導入するため、2回使用しても2番目の変数を再宣言しないため、違法です。


ただし、 "multi-variable"宣言で2回使用できます。変数の1つが新しい場合

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

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


短い宣言を使用して、新しいスコープで変数を宣言できます。その変数は、同じ名前で既に宣言されています:

var foo int = 34

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

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


これらを複数変数の宣言と割り当てに使用できます。

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

次のような短いステートメントブロックで同じ名前を宣言できます:ifforswitch

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

なぜなら、if foo := ...fooは、そのif句にのみ属し、別のスコープ内にあるためです。


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


参照:

55
Inanc Gumus

:=は宣言の省略形です。

a := 10
b := "Gopher"

aintとして宣言され、値10で初期化されますが、bは文字列として宣言され、値Gopherで初期化されます。

=を使用した同等のものは

var a = 10
var b = "Gopher"

=は代入演算子です。他の言語で使用するのと同じ方法で使用されます。

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

19
ShuklaSannidhya

:=は宣言して割り当て、=は単に割り当てます

コードをtypeまたはstruct宣言で埋めたくない場合に便利です。

// 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)
10
Gustav

:=はandを宣言することを意味し、=は単に割り当てることを意味します。

10
Ralph Caraveo

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

関数内では、:=短い代入ステートメントを暗黙的な型のvar宣言の代わりに使用できます。

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

6

「:=」は、宣言と初期化を同時に行うために使用します。以下に例を示します。

「=」の使用

var i int

i = 10

https://play.golang.org/p/RU88ty_SGa

「:=」の使用

i:= 10

https://play.golang.org/p/XBdjBh-DQB

2
Nisal Edu

両方とも、Go言語での変数宣言の異なる手法です。

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

そして

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

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

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

変数宣言

短い変数宣言

1
Pravin Mishra

多くの人がすでに言っているように-:=は宣言と割り当てを意味します。 =は単に割り当てることを意味します。ここで重要なのは、機能する場合は

foo := 2.5

goはfooがいくつかのことに基づいてfloat32またはfloat64であるかどうかを決定しますが、一度決定してfloat64としてコンパイルすると、fooをfloat32として使用できません。したがって、完全な構文を使用した方がよい場合があります。

0
Belial