最近、私はグーグルの新しいプログラミング言語で遊んでいました Go
そして、なぜ代入演算子:=
には、等号の前にコロンがあります=
言語の作者がname := "John"
の代わりに name = "John"
:=
表記は、宣言と初期化の両方として機能します。
foo := "bar"
に等しい
var foo = "bar"
スクリプト言語のようにfoo = "bar"
のみを使用しないのはなぜですか?まあ、それはタイプミスを避けるためです。
foo = "bar"
fooo = "baz" + foo + "baz" // Oops, is fooo a new variable or did I mean 'foo' ?
name := "John"
ただの構文糖
var name string
name = "John"
Goは静的に型付けされるため、変数を宣言する必要があります。
:=
は代入演算子ではありません。これは短い変数宣言です。 =
は割り当て演算子です。
短い変数宣言は次の構文を使用します。
ShortVarDecl = IdentifierList ":=" ExpressionList .
これは、初期化式はあるが型はない通常の変数宣言の省略形です。
"var" IdentifierList = ExpressionList .
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
Goでは、name := "John"
はvar name = "John"
の省略形です。
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セッション中。便利だが問題があると呼びます。
回答の重要なコンテキスト:
:=
は、変数を初期化するための略記演算子です。 Goでは、次の操作は同等です。
var myNumb String = "one"
myNumb := "one"
回答:
暗黙の質問は次のとおりです。「なぜ[:=
]の前に:
を付けるように短縮表記=
を設計したのですか?]その理由は、一般的なタイプミスを防ぐためです。簡略表記の代入演算子が=
である場合、次の状況が発生する可能性があります。
var myNumb String = "one"
myNumb = "two"
そのコードを作成したユーザーは、two
をmyNumb
に再割り当てするつもりでしたか、またはmyNumb
を正しく入力する代わりにmyNumbTwo
を間違って入力しましたか? :=
にコロンを含めると、プログラマはバグを抱えるために2つのエラー(コロンを忘れてvar
を忘れる)をコミットする必要があり、そうする可能性が低くなります劇的に。
少なくとも1つの微妙な違いがあります
name := "John"
そして
var name = "John"
前者は非宣言ステートメントであり、関数本体の外部では許可されませんが、後者はパッケージレベルで有効なステートメントです。