Go宣言の「_」(アンダースコアコンマ)とは何ですか?


100

そして、私はこの種の変数宣言を理解できないようです:

_, prs := m["example"]

_,」が正確に何をしているのか、なぜこれらの代わりにこのような変数を宣言したのか

prs := m["example"]

(私はGo by Example:Mapsの一部としてそれを見つけました)


3
今後の言語の質問については、まず仕様をご覧ください。それはあなたのすべての質問に答えるべきです。
fuz

コメントとして:prsおそらく「プレゼント」を意味します。あなたの例のコードは"example"mマップ内のエントリの有無をチェックしています。
-dyoo

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

@dyoo以下の説明を読んだ後、その意味を理解しましたが、他の誰かが同じ質問をしている場合は注目に値します!
Kansuler、2015年

8
@FUZxxl:わかりません。SOで尋ねられる質問のほとんどは、おそらくどこかで回答が得られますいくつかのしきい値が存在し、その下ではおそらく質問されるべきではありませんが、この質問がその下にあるとは思いません。
2016年

回答:


120

戻り値のすべての変数を宣言する必要がなくなります。
これは、空白識別子と呼ばます。

のように:

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

他の「_」ユースケースはインポート用です

これは戻り値を破棄するため、「効果的なGo、マップ」に示されている「マップ内のキーの存在をテストする方法は?」のように、戻り値の1つだけをチェックする場合に役立ちます。

_, present := timeZone[tz]

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

以下のようJsorは追加コメントで

「一般に受け入れられている標準」は、メンバーシップテスト変数を「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
}

良い例を挙げてくれてありがとう。コンセプトを理解するのに少し考えが必要でしたが、今はそうです!
Kansuler、2015年

IMEの「一般に受け入れられている標準」は、メンバーシップテスト変数を「ok」と呼ぶことに注意してください(チャネルの読み取りが有効かどうかを確認する場合と同じ)。
LinearZoetrope 2015年

1
@Jsor同意する。見やすくするために回答にコメントを含め、いくつかの例を追加しました。
VonC、2015年

63

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

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

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

ループ内でiを使用しないため、次のように変更する必要があります。

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

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

4

_空白の識別子です。割り当てる値が破棄されることを意味します。

ここでは、example破棄されるのはキーの値です。コードの2行目は、プレゼンスブール値を破棄し、値をに格納しますprs
したがって、マップ内の存在のみを確認するには、値を破棄できます。これは、マップをセットとして使用するために使用できます。


3

空白の識別子は、構文で変数名が必要な場合に使用できますが、プログラムロジックでは必要ありません。たとえば、要素の値のみが必要な場合に不要なループインデックスを破棄します。

抜粋:

Goプログラミング言語(Addison-Wesley Professional Computingシリーズ)

ブライアンW.カーニガン

この素材は著作権により保護されている場合があります。


2

これは空の識別子と呼ばれ、返される値を破棄してそれを参照しない場合に役立ちます。

私たちがそれを使用するいくつかの場所:

  • 関数が値を返し、将来使用する予定がない
  • 反復処理を行い、使用しないi値が必要な場合

2

未使用の変数の優れた使用例は、部分的な出力のみが必要な場合です。以下の例では、値(州の人口)のみを出力する必要があります。

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

1

基本的に、_,空白の識別子と呼ばれます。GOでは、使用されていない変数を持つことはできません。

value:= rangeを使用している場合、配列を反復処理するときのインスタンスとして、反復処理にi値を使用したくありません。ただし、i値を省略すると、エラーが返されます。ただし、iを宣言して使用しなかった場合も、エラーが返されます。

したがって、それが私たちが使用しなければならない場所_,です。

また、今後関数の戻り値が必要ない場合にも使用されます。


0

未使用の変数はGolangでは許可されていません

他のプログラミング言語を使用している場合、これに慣れるのは少し難しいかもしれません。しかし、これによりコードがよりクリーンになります。したがって、a _を使用することで、そこに変数があることはわかっているが、それを使用したくなく、コンパイラーにそれについて文句を言わないように伝えます。:)

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