Direct naar de hoofdinhoud
Module 4 · Les 3 van 518/50 in de cursus~12 min
Modulelessen (3/5)

Kaarten: sleutels en waarden

Een kaart is een sleutel → waarde-hashtabel: map[K]V. Kaarten zijn referentie types: doorgegeven aan een functie, ze delen dezelfde opslag. Dat moeten ze zijn geïnitialiseerd voordat u ernaar kunt schrijven (met make of een letterlijke waarde).

Creatie

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

Basisbewerkingen

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: onderscheid maken tussen "ontbrekend" en "nulwaarde"

Go
v, ok := m["x"]
if !ok {
    fmt.Println("key missing")
} else {
    fmt.Println("found:", v)
}

Het is de enige manier om te weten of een sleutel bestaat, omdat m["x"] terugkeert de nulwaarde, zelfs als de sleutel er niet is. Een fundamenteel patroon.

Iteratie: willekeurige volgorde

Go
for k, v := range m {
    fmt.Println(k, v)
}

Toetsen: alleen vergelijkbare typen

Sleutels moeten vergelijkbaar zijn: string, cijfers, bool, wijzers, kanalen, interfaces, arrays van vergelijkbare typen, vergelijkbare structuren velden. Slices, kaarten en functies zijn niet vergelijkbaar → dat kunnen ze niet sleutels zijn.

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

Patroon: tellers

Een van de meest voorkomende toepassingen van kaarten:

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}

Probeer het

Oefening#go.m4.l3.e1
Pogingen: 0Laden…

Maak een map[string]int met de waarden 'a' -> 1 en 'b' -> 2, en voeg vervolgens 'c' -> 3 toe.

Editor laden…
Toon hint

Letterlijk: `map[K]V{"sleutel": waarde, ...}`.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m4.l3.e2
Pogingen: 0Laden…

Gebruik het komma-ok-patroon om de sleutel 'x' (niet aanwezig) in v, ok te lezen en beide af te drukken.

Editor laden…
Toon hint

Twee retourwaarden: de waarde en een aanwezigheidsboolean.

Oplossing beschikbaar na 3 pogingen

Quiz#go.m4.l3.e3
Klaar

Wat gebeurt er als ik naar een nulkaart schrijf?

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

Samenvatten

  • map[K]V: sleutelwaarde, referentie, hash-backed.
  • Initialiseer met make of een letterlijke; nulkaart → paniek bij schrijven.
  • v, ok := m[k] is de enige manier om onderscheid te maken tussen "ontbrekend" en "nulwaarde".
  • delete(m, k) verwijdert; oké, zelfs als k niet bestaat.
  • range iteratie: willekeurige volgorde.
  • Toetsen: alleen vergelijkbare typen (geen slice/map/func).
  • Tellerpatroon: freq[k]++ maakt gebruik van de impliciete nulwaarde.