Lektionen des Moduls (3/5)
Maps: Keys und Werte
Eine Map ist eine Schlüssel→Wert-Hash-Tabelle: map[K]V. Karten sind Referenz
Typen: An eine Funktion übergeben, teilen sie sich den gleichen Speicher. Das müssen sie sein
initialisiert, bevor Sie darauf schreiben können (mit make oder einem Literal).
Schöpfung
// with a literal
prices := map[string]int{"pane": 2, "latte": 3}
// with make
counters := make(map[string]int)
counters["a"] = 1
// nil map (readable, NOT writable)
var m map[string]int
fmt.Println(m["x"]) // 0 — ok
// m["y"] = 1 // PANICGrundlegende Operationen
m := map[string]int{"a": 1}
m["b"] = 2 // insert/update
v := m["a"] // get; if missing: zero value
delete(m, "a") // remove (ok even if the key doesn't exist)
n := len(m) // number of entriesKomma-ok: Unterscheidung zwischen „fehlend“ und „Nullwert“
v, ok := m["x"]
if !ok {
fmt.Println("key missing")
} else {
fmt.Println("found:", v)
}Nur so kann festgestellt werden, ob ein Schlüssel vorhanden ist, da m["x"] zurückgegeben wird
der Nullwert, auch wenn der Schlüssel nicht vorhanden ist. Ein grundlegendes Muster.
Iteration: zufällige Reihenfolge
for k, v := range m {
fmt.Println(k, v)
}Schlüssel: nur vergleichbare Typen
Schlüssel müssen vergleichbar sein: string, Zahlen, bool, Zeiger,
Kanäle, Schnittstellen, Arrays vergleichbarer Typen, Strukturen vergleichbarer
Felder. Slices, Maps und Funktionen sind nicht vergleichbar → können sie nicht
Schlüssel sein.
m := map[[2]int]string{} // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparableMuster: Zähler
Eine der häufigsten Verwendungen von Karten:
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
freq[w]++ // access to a missing key is 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}Probieren Sie es aus
Erstellen Sie eine Map[string]int mit den Werten „a“ -> 1 und „b“ -> 2 und fügen Sie dann „c“ -> 3 hinzu.
Hinweis anzeigen
Wörtlich: `map[K]V{"key": value, ...}`.
Lösung nach 3 Versuchen verfügbar
Verwenden Sie das Komma-OK-Muster, um den Schlüssel „x“ (nicht vorhanden) in v, ok einzulesen und beides auszugeben.
Hinweis anzeigen
Zwei Rückgabewerte: der Wert und ein boolescher Präsenzwert.
Lösung nach 3 Versuchen verfügbar
Was passiert beim Schreiben in eine Null-Map?
var m map[string]int
m["a"] = 1Zusammenfassung
map[K]V: Schlüsselwert, Referenz, Hash-gestützt.- Mit
makeoder einem Literal initialisieren; Null-Karte → Panik beim Schreiben. v, ok := m[k]ist die einzige Möglichkeit, „fehlenden“ von „Nullwert“ zu unterscheiden.delete(m, k)entfernt; ok, auch wennknicht existiert.range-Iteration: zufällige Reihenfolge.- Schlüssel: nur vergleichbare Typen (kein Slice/Map/Func).
- Zählermuster:
freq[k]++nutzt den impliziten Nullwert.