Go言語の代入演算子


83

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

代入演算子の:=前に等号がコロンがあるのはなぜだろうと思ってい= た言語の作者がname := "John"代わりに使用したいと思った特別な理由はありますかname = "John"


すばらしい質問と答えは、割り当てに=を使用するのは間違いだということです。x + 2 = 4は方程式であり、割り当てではないことを早い段階で学びました。ただし、割り当ては同等性のチェックよりもはるかに頻繁であるため、一部の主要な言語では、早い段階で割り当てに「=」を使用し始めました...そして規則は固執しました。
リックオシェイ

回答:


120

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

foo := "bar"

と同等です

var foo = "bar"

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

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

39
name := "John"

のための単なる構文糖衣です

var name string
name = "John"

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


6
name := "John"の省略形ですvar name = "John"
peterSO 2013年

13
@peterSOしかしvar name = "John"ために短いvar name string = "John"所定の2ライン分の短いです。
デイブC

2
@Dave C:Goプログラミング言語の仕様は明示的です:「短い変数宣言...は、初期化式を含むが型を含まない通常の変数宣言の省略形です:"var" IdentifierList = ExpressionList .」。
peterSO 2013年

7
@peterSO私は知っています、私もそれを読みました。それは私が言ったことを変えません。この答えは正しいです。
デイブC

1
@KennethWorden読みやすさをどのように妨げますか?不要な情報を最小限に抑えます。完全な型推論を備えた言語は、これが良いことである理由の良い例です。
Joonazan 2017年

18

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

短い変数宣言

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

ShortVarDecl = IdentifierList ":=" ExpressionList .

これは、初期化式を使用し、型を使用しない通常の変数宣言の省略形です。

"var" IdentifierList = ExpressionList .

課題

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

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


11

Rob Pike、Goが:=彼の講演「Originsof Go」(2010)でなぜ持っているのかを説明しています

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

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

限界メモ: Robert Griesemer :=、「Goから取り出したものの1つは何ですか?」という質問に答えるオペレーターを紹介します。Google I / O2013でのQAセッション中。便利ですが問題があると言及しています。


4

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

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

そして

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

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

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

変数宣言

短い変数宣言


4

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

name := "John"

そして

var name = "John"

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


2

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

:=変数を初期化するための省略演算子です。行く、以下の操作は同じです。

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

回答:

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

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

そのコードを作成したユーザーは、に再割り当てtwoするつもりmyNumbでしたか、それともmyNumb正しく入力する代わりにタイプミスしましたmyNumbTwoか?にコロンを含めることにより:=、プログラマーはvarバグを発生させるために2つのエラーをコミットする必要があります(コロンを忘れて)。したがって、そうする可能性が大幅に減少ます。

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