2015-01-04 9 views
42

Ich bin neu in Golang und versuche es zu lernen, komme aus PHP und Java.Was ist "_" in einer Golang-Deklaration?

Und ich kann nicht diese Art von Variablendeklaration zu verstehen scheinen:

_, prs := m["example"] 

Was genau ist „_“ tun und warum haben sie deklariert eine Variable wie folgt statt

prs := m["example"] 

Ich fand es in diesem Beispiel: https://gobyexample.com/maps

Vielen Dank für Ihre Hilfe!

+3

Für zukünftige Sprache Fragen haben, bitte einen Blick auf die [spec] (http: // golang. org/ref/spec) zuerst. Es sollte alle Ihre Fragen beantworten. – fuz

+0

Als Kommentar: 'prs' steht wahrscheinlich für" Gegenwart ". Der Code in Ihrem Beispiel prüft, ob ein Eintrag für "example" in der Map "m" vorhanden oder nicht vorhanden ist. – dyoo

+2

@FUZxxl Ja, ich habe mich vorher schon einmal angesehen, aber da ich den Namen des Features nicht kannte, habe ich es nicht gefunden. Auch finde ich die offiziellen Spezifikationen für Programmiersprachen, die nicht sehr pädagogisch sind und eher mit dem Beispiel lernen. – Kansuler

Antwort

59

Es vermeidet, alle Variablen für die Rückgabewerte deklarieren zu müssen.
Es heißt blank identifier.

Wie in:

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

(die other '_' use case is for import)

Da es den Rückgabewert verwirft, ist es hilfreich, wenn Sie nur eine der zurückgegebenen Werte überprüfen möchten, wie in „How to test key existence in a map?“ gezeigt in "Effective Go, map":

_, present := timeZone[tz] 

für Präsenz in der Karte Um zu testen, mit Wenn Sie sich über den tatsächlichen Wert Gedanken machen, können Sie die leere Kennung verwenden, einen einfachen Unterstrich (_).
Die leere Kennung kann mit einem beliebigen Wert eines beliebigen Typs zugewiesen oder deklariert werden, wobei der Wert harmlos verworfen wird.
Um das Vorhandensein in einer Karte zu testen, verwenden Sie den leeren Bezeichner anstelle der üblichen Variablen für den Wert.

Wie Jsor fügt in the comments:

"allgemein anerkannten Standard" ist die Mitgliedschaft Testvariablen "ok" nennen (das gleiche für die Überprüfung, ob ein Kanal Lese gültig war oder nicht)

Damit können Sie es mit Test kombinieren:

Sie würden es auch in Schleife finden:

Wenn Sie nur das zweite Element im Bereich (der Wert) benötigen, verwenden Sie die leere Kennung, einen Unterstrich, die erste zu verwerfen:

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

Vielen Dank für ein gutes Beispiel. Es hat mich ein bisschen nachgedacht, das Konzept zu verstehen, aber jetzt tue ich es! – Kansuler

+0

Beachten Sie, dass IME "allgemein akzeptierter Standard" ist, die Mitgliedschafts-Testvariablen "ok" zu nennen (dasselbe für die Überprüfung, ob ein Kanal gelesen wurde oder nicht). – LinearZoetrope

+0

@Jsor Ich stimme zu. Ich habe Ihren Kommentar in die Antwort für mehr Sichtbarkeit aufgenommen und ein paar zusätzliche Beispiele hinzugefügt. – VonC

3

_ ist die leere Kennung. Bedeutung der Wert, den es zugewiesen werden sollte, wird verworfen.

Hier ist der Wert example Schlüssel verworfen. Die zweite Codezeile würde die Präsenz Boolean verwerfen und den Wert in prs speichern.
Um nur das Vorhandensein in der Karte zu überprüfen, können Sie den Wert verwerfen. Dies kann verwendet werden, um eine Karte als einen Satz zu verwenden.

+0

Ihre Erklärung hat mir auch geholfen, danke! – Kansuler

25

Mit dem Go-Compiler können Sie keine Variablen erstellen, die Sie nie verwenden.

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

Der obige Code wird eine Fehlermeldung "ich erklärte und nicht verwendet" zurückgeben.

Da wir i nicht innerhalb unserer Schleife benutzen wir es, dies ändern müssen:

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

Ihr erster Satz war wichtig, um den Grund zu verstehen, warum es eine _ als leere Kennung gibt. – Tarik