web-dev-qa-db-ja.com

Go言語の代入演算子

最近、私はグーグルの新しいプログラミング言語で遊んでいました Go

そして、なぜ代入演算子:=には、等号の前にコロンがあります=言語の作者がname := "John" の代わりに name = "John"

75
Nenad

:=表記は、宣言と初期化の両方として機能します。

foo := "bar"

に等しい

var foo = "bar"

スクリプト言語のようにfoo = "bar"のみを使用しないのはなぜですか?まあ、それはタイプミスを避けるためです。

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?
111
Fabien
name := "John"

ただの構文糖

var name string
name = "John"

Goは静的に型付けされるため、変数を宣言する必要があります。

33
Joonazan

:=は代入演算子ではありません。これは短い変数宣言です。 =は割り当て演算子です。

短い変数宣言

短い変数宣言は次の構文を使用します。

ShortVarDecl = IdentifierList ":=" ExpressionList .

これは、初期化式はあるが型はない通常の変数宣言の省略形です。

"var" IdentifierList = ExpressionList .

割り当て

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

Goでは、name := "John"var name = "John"の省略形です。

18
peterSO

Rob Pike 説明 Goが「Origins of Go」(2010)で:=を持っている理由。

:=は、PikeによってNewsquek(1989)と呼ばれるコード署名された別の言語の疑似演算子でした。 Pascal風の表記法と、イディオムを宣言して初期化するための型を推測する機能がありました( 15ページ

// variable: [type] = value
x: int = 1
x := 1

マージナルノート:Robert Griesemer brings up:=演算子「あなたが取るものは何だろう」に答える演算子Goから?」 Google I/O 2013でのQAセッション中。便利だが問題があると呼びます。

10
user2418306

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

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

そして

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

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

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

変数宣言

短い変数宣言

4
Pravin Mishra

回答の重要なコンテキスト:

:=は、変数を初期化するための略記演算子です。 Goでは、次の操作は同等です。

var myNumb String = "one"
myNumb := "one"

回答:

暗黙の質問は次のとおりです。「なぜ[:=]の前に:を付けるように短縮表記=を設計したのですか?]その理由は、一般的なタイプミスを防ぐためです。簡略表記の代入演算子が=である場合、次の状況が発生する可能性があります。

var myNumb String = "one"
myNumb = "two"

そのコードを作成したユーザーは、twomyNumbに再割り当てするつもりでしたか、またはmyNumbを正しく入力する代わりにmyNumbTwoを間違って入力しましたか? :=にコロンを含めると、プログラマはバグを抱えるために2つのエラー(コロンを忘れてvarを忘れる)をコミットする必要があり、そうする可能性が低くなります劇的に

2
Webeng

少なくとも1つの微妙な違いがあります

name := "John"

そして

var name = "John"

前者は非宣言ステートメントであり、関数本体の外部では許可されませんが、後者はパッケージレベルで有効なステートメントです。

2
maria s