Direkt zum Hauptinhalt springen
eLearner.app
Modul 4 · Lektion 3 von 518/50 im Kurs~12 min
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

Go
// 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          // PANIC

Grundlegende Operationen

Go
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 entries

Komma-ok: Unterscheidung zwischen „fehlend“ und „Nullwert“

Go
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

Go
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.

Go
m := map[[2]int]string{}   // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparable

Muster: Zähler

Eine der häufigsten Verwendungen von Karten:

Go
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

Übung#go.m4.l3.e1
Versuche: 0Wird geladen…

Erstellen Sie eine Map[string]int mit den Werten „a“ -> 1 und „b“ -> 2 und fügen Sie dann „c“ -> 3 hinzu.

Editor wird geladen…
Hinweis anzeigen

Wörtlich: `map[K]V{"key": value, ...}`.

Lösung nach 3 Versuchen verfügbar

Übung#go.m4.l3.e2
Versuche: 0Wird geladen…

Verwenden Sie das Komma-OK-Muster, um den Schlüssel „x“ (nicht vorhanden) in v, ok einzulesen und beides auszugeben.

Editor wird geladen…
Hinweis anzeigen

Zwei Rückgabewerte: der Wert und ein boolescher Präsenzwert.

Lösung nach 3 Versuchen verfügbar

Quiz#go.m4.l3.e3
Bereit

Was passiert beim Schreiben in eine Null-Map?

Go
var m map[string]int
m["a"] = 1
Antwortoptionen

Zusammenfassung

  • map[K]V: Schlüsselwert, Referenz, Hash-gestützt.
  • Mit make oder 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 wenn k nicht existiert.
  • range-Iteration: zufällige Reihenfolge.
  • Schlüssel: nur vergleichbare Typen (kein Slice/Map/Func).
  • Zählermuster: freq[k]++ nutzt den impliziten Nullwert.