2015-01-04 13 views
42

私はGolangに慣れていないし、PHPとJavaから来て、それを学ぼうとしている。ゴラン宣言で「_」とは何ですか?

そして私は、変数宣言のこの種を理解するように見えることはできません。

_, prs := m["example"] 

「_、」やっていると、なぜ彼らは代わりに

prs := m["example"] 
のこのような変数を宣言している正確にどのような

私はこの例でそれを見つけました: https://gobyexample.com/maps

私を助けてくれてありがとう!

+3

を将来の言語の質問については、[仕様]を見てくださいます(http:// golang。 org/ref/spec)を指定します。それはすべてのあなたの質問に答える必要があります。 – fuz

+0

コメント: 'prs'はおそらく" present "の略です。あなたの例のコードは '' m''マップの '' example "'のエントリの有無をチェックしています。 – dyoo

+2

@FUZxxlはい、以前はそこを見ていましたが、機能の名前がわからないため、見つけられませんでした。また、私はプログラミング言語の公式な仕様があまり教育的ではなく、むしろ例で学ぶことがわかりました。 – Kansuler

答えて

59

戻り値のすべての変数を宣言する必要はありません。
blank identifierと呼ばれます。

のように:

_, y, _ := coord(p) // coord() returns three values; only interested in y coordinate 

other '_' use case is for import

それは、戻り値を破棄しているので、あなたが一つだけ返された値のを確認したいとき示さ「How to test key existence in a map?」のように、それは、便利です"Effective Go, map" で:

_, present := timeZone[tz] 

とマップに存在するかをテストするには実際の値を心配すると、空白の識別子、単純なアンダースコア(_)を使用することができます。
空白の識別子は、任意の値の任意の値で割り当てまたは宣言できます。値は無害に破棄されます。
マップ内の存在をテストするには、値の通常の変数の代わりに空白の識別子を使用します。 Jsorとして

in the commentsを追加します。

「一般的に、標準的な受け入れ」(チャネル読み取りが有効であったか否かをチェックするために同じ)、「OK」の会員テスト変数を呼び出すことです

これをテストと組み合わせることができます:

if _, err := os.Stat(path); os.IsNotExist(err) { 
    fmt.Printf("%s does not exist\n", path) 
} 

あなたは、ループの中でも、それを見つけるだろう:

あなたが最初に破棄するように、アンダースコアを空白の識別子を使用して、範囲(値)で2番目のアイテムが必要な場合:

sum := 0 
for _, value := range array { 
    sum += value 
} 
+0

良い例を与えてくれてありがとう。私はコンセプトを理解するためにいくつかの考えを持っていましたが、今はそうです! – Kansuler

+0

IMEの「一般に受け入れられている標準」は、メンバシップテスト変数「ok」を呼び出すことです(チャネル読み出しが有効かどうかを確認する場合も同じです)。 – LinearZoetrope

+0

@Jsor私は同意します。私はあなたのコメントを答えに加えてより多くの視察を加え、いくつかの例を追加しました。 – VonC

3

_は空白の識別子です。つまり、割り当てるべき値は破棄されます。

ここでは、捨てられるexampleキーの値です。 2行目のコードでは、の存在が破棄され、ブール値が格納され、値はprsに格納されます。
マップ上の存在をチェックするだけで、値を破棄することができます。これは、マップをセットとして使用するために使用できます。

+0

あなたの説明も私を助け、ありがとう! – Kansuler

25

Goコンパイラでは、決して使用しない変数を作成することはできません。

for i, value := range x { 
    total += value 
} 

上記のコードは「私が宣言され、使用しない」というエラーメッセージが返されます。

私たちは、私は内部の私たちのループの我々はこれにそれを変更する必要は使用しませんので:

for _, value := range x { 
    total += value 
} 
+1

最初の文は、空白の識別子として_がある理由を理解する上で重要でした。 – Tarik

関連する問題