Wie in anderen Antworten angegeben, besteht die allgemeine Lösung darin, einen Indexausdruck in einer Zuweisung der speziellen Form zu verwenden:
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]
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:
m := map[int]string{}
s := m[1] // s will be the empty string ""
var m2 map[int]float64 // m2 is nil!
f := m2[2] // f will be 0.0
fmt.Printf("%q %f", s, f) // Prints: "" 0.000000
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 den string
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:
m := map[int]string{
0: "zero",
1: "one",
}
fmt.Printf("Key 0 exists: %t\nKey 1 exists: %t\nKey 2 exists: %t",
m[0] != "", m[1] != "", m[2] != "")
Ausgabe (versuchen Sie es auf dem Go-Spielplatz ):
Key 0 exists: true
Key 1 exists: true
Key 2 exists: false
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 werden nil
.
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:
set := map[string]bool{
"one": true,
"two": true,
}
fmt.Println("Contains 'one':", set["one"])
if set["two"] {
fmt.Println("'two' is in the set")
}
if !set["three"] {
fmt.Println("'three' is not in the set")
}
Es gibt aus (versuchen Sie es auf dem Go Playground ):
Contains 'one': true
'two' is in the set
'three' is not in the set
Siehe verwandte: Wie kann ich ein Array erstellen, das eindeutige Zeichenfolgen enthält?