Ich weiß, dass ich über eine Karte iterieren kann, m
indem ich
for k, v := range m { ... }
und nach einem Schlüssel suchen, aber gibt es eine effizientere Möglichkeit, die Existenz eines Schlüssels in einer Karte zu testen?
Ich konnte die Antwort in der Sprachspezifikation nicht finden .
dictionary
go
go-map
Grokus
quelle
quelle
Antworten:
Einzeilige Antwort:
Erläuterung:
if
Anweisungen in Go können sowohl eine Bedingungs- als auch eine Initialisierungsanweisung enthalten. Im obigen Beispiel werden beide verwendet:Initialisiert zwei Variablen -
val
erhält entweder den Wert "foo" von der Karte oder einen "Nullwert" (in diesem Fall die leere Zeichenfolge) undok
erhält einen Bool, der auf gesetzt wird,true
wenn "foo" tatsächlich in der Karte vorhanden warwertet aus
ok
, was sein wird,true
wenn "foo" in der Karte warWenn "foo" tatsächlich in der Karte vorhanden ist, wird der Hauptteil der
if
Anweisung ausgeführt undval
ist lokal für diesen Bereich.quelle
var val string = ""
bleibt gleich,val, ok :=
erstellt eine neue lokale Variable mit demselben Namen, die nur in diesem Block sichtbar ist.if key in dict
.Zusätzlich zur Spezifikation der Go-Programmiersprache sollten Sie Effective Go lesen . Im Abschnitt über Karten heißt es unter anderem:
quelle
Durchsuchte die verrückte E-Mail-Liste und fand eine Lösung, die von Peter Froehlich am 15.11.2009 veröffentlicht wurde.
Oder kompakter:
Beachten Sie, dass bei Verwendung dieser Form der
if
Anweisung die Variablenvalue
undok
nur innerhalb derif
Bedingungen sichtbar sind .quelle
_, ok := dict["baz"]; ok
. Der_
Teil wirft den Wert weg, anstatt eine temporäre Variable zu erstellen.Kurze Antwort
Beispiel
Hier ist ein Beispiel auf dem Go Playground .
Längere Antwort
Im Abschnitt " Karten " von Effective Go :
quelle
Wie in anderen Antworten angegeben, besteht die allgemeine Lösung darin, einen Indexausdruck in einer Zuweisung der speziellen Form zu verwenden:
Das ist schön und sauber. Es gibt jedoch einige Einschränkungen: Es muss sich um eine Zuweisung einer speziellen Form handeln. Der Ausdruck auf der rechten Seite darf nur der Kartenindexausdruck sein, und die Liste der Ausdrücke auf der linken Seite muss genau zwei Operanden enthalten, denen zum einen der Werttyp und zum anderen ein
bool
Wert zuweisbar ist. Der erste Wert des Ergebnisses dieses speziellen Formulars ist der dem Schlüssel zugeordnete Wert, und der zweite Wert gibt an, ob tatsächlich ein Eintrag in der Karte mit dem angegebenen Schlüssel vorhanden ist (wenn der Schlüssel in der Karte vorhanden ist). Die Ausdrucksliste auf der linken Seite kann auch die leere Kennung enthalten wenn eines der Ergebnisse nicht benötigt wird.Es ist wichtig zu wissen, dass der Indexausdruck
nil
den Nullwert des Werttyps der Karte ergibt, wenn der indizierte Kartenwert den Schlüssel enthält oder nicht . Also zum Beispiel:Probieren Sie es auf dem Go Playground aus .
Wenn wir also wissen, dass wir den Nullwert in unserer Karte nicht verwenden, können wir dies nutzen.
Wenn der Werttyp beispielsweise ist
string
und wir wissen, dass wir niemals Einträge in der Karte speichern, in denen der Wert die leere Zeichenfolge ist (Nullwert für denstring
Typ), können wir auch testen, ob sich der Schlüssel in der Karte befindet, indem wir das Nicht-Spezial vergleichen Form des (Ergebnisses des) Indexausdrucks auf den Nullwert:Ausgabe (versuchen Sie es auf dem Go-Spielplatz ):
In der Praxis gibt es viele Fälle, in denen wir den Nullwert nicht in der Karte speichern, sodass dieser häufig verwendet werden kann. Beispielsweise haben Schnittstellen und Funktionstypen einen Nullwert
nil
, den wir häufig nicht in Karten speichern. Das Testen, ob sich ein Schlüssel in der Karte befindet, kann also durch Vergleichen mit erreicht werdennil
.Die Verwendung dieser "Technik" hat noch einen weiteren Vorteil: Sie können das Vorhandensein mehrerer Schlüssel auf kompakte Weise überprüfen (dies ist mit dem speziellen Formular "Komma OK" nicht möglich). Mehr dazu: Überprüfen Sie, ob der Schlüssel in mehreren Karten unter einer Bedingung vorhanden ist
Wenn Sie beim Indizieren mit einem nicht vorhandenen Schlüssel den Nullwert des Wertetyps erhalten, können Sie auch Karten mit
bool
Werten bequem als Mengen verwenden . Zum Beispiel:Es gibt aus (versuchen Sie es auf dem Go Playground ):
Siehe verwandte: Wie kann ich ein Array erstellen, das eindeutige Zeichenfolgen enthält?
quelle
T
invar v, ok T = a[x]
? ist nichtok
sein Bool muss?map[bool]bool
undT
istbool
, aber es funktioniert auch, wenn die Karte vom Typ istmap[interface{}]bool
undT
istinterface{}
; Darüber hinaus funktioniert es auch mit benutzerdefinierten Typen, derenbool
zugrunde liegender Typ alle auf dem Go Playground anzeigen . Da dieses Formular mit mehreren ersetzten Typen gültig ist, wirdT
das AllgemeineT
verwendet. Typ vonok
kann alles sein, dem ein untypisierterbool
Typ zugewiesen werden kann.besserer Weg hierher
quelle
quelle
Dann gehen Sie Karten ausführen. Gibt es etwas, das existiert? wahr existiert nicht? falsch
quelle
_, ok = m["somestring"]
sollte sein=_, ok := m["somestring"]
Es wird unter "Indexausdrücke" erwähnt .
quelle
Zu diesem Zweck kann eine Zwei-Wert-Zuordnung verwendet werden. Bitte überprüfen Sie mein Beispielprogramm unten
quelle