Was ist "_" (Unterstreichungskomma) in einer Go-Deklaration?

99

Und ich kann diese Art der Variablendeklaration nicht verstehen:

_, prs := m["example"]

Was genau macht " _," und warum haben sie stattdessen eine solche Variable deklariert ?

prs := m["example"]

(Ich fand es als Teil von Go by Example: Maps )

Kansuler
quelle
3
Bei zukünftigen Sprachfragen schauen Sie sich bitte zuerst die Spezifikation an . Es sollte alle Ihre Fragen beantworten.
Fuz
Als Kommentar: prssteht wahrscheinlich für "Gegenwart". Der Code in Ihrem Beispiel überprüft, ob ein Eintrag "example"in der mKarte vorhanden ist oder nicht.
Dyoo
6
@FUZxxl Ja, ich habe dort vorher nachgesehen, aber da ich den Namen des Features nicht kannte, habe ich ihn nicht gefunden. Außerdem finde ich die offiziellen Spezifikationen für Programmiersprachen nicht sehr pädagogisch und lerne eher anhand von Beispielen.
Kansuler
@dyoo Nachdem ich die Erklärung unten hatte, fand ich heraus, was es bedeutet, aber es ist erwähnenswert, wenn jemand anderes die gleiche Frage hat!
Kansuler
8
@FUZxxl: Ich weiß es nicht. Die meisten Fragen zu SO haben wahrscheinlich irgendwo Antworten . Es gibt eine Schwelle, unter der eine Frage wahrscheinlich nicht gestellt werden sollte, aber ich glaube nicht, dass diese Frage darunter fällt.
21.

Antworten:

119

Es wird vermieden, dass alle Variablen für die Rückgabewerte deklariert werden müssen.
Es wird als leere Kennung bezeichnet .

Wie in:

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

(Der andere _Anwendungsfall ist für den Import )

Da der Rückgabewert verworfen wird, ist es hilfreich, wenn Sie nur einen der zurückgegebenen Werte überprüfen möchten, wie in " So testen Sie die Schlüsselexistenz in einer Karte " in " Effective Go, map " gezeigt:

_, present := timeZone[tz]

Um die Präsenz in der Karte zu testen, ohne sich um den tatsächlichen Wert zu kümmern, können Sie den leeren Bezeichner 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.
Verwenden Sie zum Testen der Präsenz in einer Karte die leere Kennung anstelle der üblichen Variablen für den Wert.

Wie Jsor in den Kommentaren hinzufügt :

"Allgemein anerkannter Standard" heißt, die Mitgliedschaftstestvariablen "ok" zu nennen (dasselbe gilt für die Überprüfung, ob ein gelesener Kanal gültig war oder nicht).

So können Sie es mit Test kombinieren:

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

Sie würden es auch in Schleife finden:

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

sum := 0
for _, value := range array {
    sum += value
}
VonC
quelle
Vielen Dank für ein gutes Beispiel. Ich musste nachdenken, um das Konzept zu verstehen, aber jetzt tue ich es!
Kansuler
Beachten Sie, dass IME "allgemein akzeptierter Standard" darin besteht, die Mitgliedschaftstestvariablen "ok" zu nennen (dasselbe gilt für die Überprüfung, ob ein gelesener Kanal gültig war oder nicht).
LinearZoetrope
1
@ Jsor Ich stimme zu. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen und einige zusätzliche Beispiele hinzugefügt.
VonC
63

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

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

Der obige Code gibt die Fehlermeldung "Ich habe deklariert und nicht verwendet" zurück.

Da wir i nicht in unserer Schleife verwenden, müssen wir es folgendermaßen ändern:

for _, value := range x {
   total += value
}
Juni Brosas
quelle
12
Ihr erster Satz war wichtig, um den Grund zu verstehen, warum es ein _ als leere Kennung gibt.
Tarik
4

_ist die leere Kennung. Das heißt, der Wert, der zugewiesen werden soll, wird verworfen.

Hier ist es der Wert von example Schlüssels verworfen. Die zweite Zeile des Codes würde die verwerfen Anwesenheit boolean und den Wert in prs.
Um nur das Vorhandensein in der Karte zu überprüfen, können Sie den Wert verwerfen. Dies kann verwendet werden, um eine Karte als Set zu verwenden.

ThinkChaos
quelle
3

Der leere Bezeichner kann immer dann verwendet werden, wenn für die Syntax ein Variablenname erforderlich ist, die Programmlogik jedoch nicht, um beispielsweise einen unerwünschten Schleifenindex zu verwerfen, wenn nur der Elementwert erforderlich ist.

Ausschnitt aus:

Die Go-Programmiersprache (Addison-Wesley Professional Computing Series)

Brian W. Kernighan

Dieses Material ist möglicherweise urheberrechtlich geschützt.

Koopertrooper
quelle
2

Es wird als leere Kennung bezeichnet und hilft in Fällen, in denen Sie den Wert, der zurückgegeben werden soll, verwerfen und nicht darauf verweisen möchten

Einige Orte, an denen wir es verwenden:

  • Eine Funktion gibt einen Wert zurück und Sie beabsichtigen nicht, ihn in Zukunft zu verwenden
  • Sie möchten iterieren und benötigen einen i-Wert, den Sie nicht verwenden werden
Anagha
quelle
2

Der beste Anwendungsfall für die nicht verwendete Variable ist die Situation, in der Sie nur eine Teilausgabe benötigen. Im folgenden Beispiel müssen wir nur den Wert (staatliche Bevölkerung) drucken.

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

Grundsätzlich _,als leere Kennung bekannt. In GO können wir keine Variablen haben, die nicht verwendet werden.

Wenn Sie beispielsweise ein Array durchlaufen, wenn Sie value: = range verwenden, möchten Sie keinen i- Wert zum Iterieren. Wenn Sie jedoch den i-Wert weglassen, wird ein Fehler zurückgegeben. Aber wenn Sie i deklarieren und es nicht verwenden, wird auch ein Fehler zurückgegeben.

Daher ist dies der Ort, an dem wir verwenden müssen _,.

Es wird auch verwendet, wenn Sie den Rückgabewert einer Funktion in Zukunft nicht mehr möchten.

Kaveen Hyacinth
quelle
0

Eine nicht verwendete Variable ist in Golang nicht zulässig

Wenn Sie aus anderen Programmiersprachen kommen, ist es möglicherweise etwas schwierig, sich daran zu gewöhnen. Dies führt jedoch zu einem saubereren Code. Mit a _sagen wir also, dass wir wissen, dass es dort eine Variable gibt, aber wir wollen sie nicht verwenden und sagen dem Compiler, der mich nicht darüber beschwert. :) :)

Krishnadas PC
quelle