Przejdź do głównej treści
eLearner.app
Moduł 4 · Lekcja 3 z 518/50 w kursie~12 min
Lekcje modułu (3/5)

Mapy: klucze i wartości

mapa to tabela mieszająca klucz → wartość: map[K]V. Mapy są odniesieniem typy: przekazywane do funkcji, dzielą tę samą pamięć. Muszą być zainicjowane, zanim będziesz mógł do nich napisać (za pomocą make lub literału).

Tworzenie

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

Podstawowe operacje

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

Przecinek-ok: odróżnienie „braku” od „wartości zerowej”

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

To jedyny sposób, aby dowiedzieć się, czy klucz istnieje, ponieważ zwracany jest kod m["x"] wartość zerową, nawet jeśli klucza nie ma. Podstawowy wzór.

Iteracja: kolejność losowa

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

Klucze: tylko porównywalne typy

Klucze muszą być porównywalne: string, liczby, bool, wskaźniki, kanały, interfejsy, tablice porównywalnych typów, struktury porównywalnych pola. Plasterki, mapy i funkcje nie są porównywalne → nie mogą być kluczami.

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

Wzór: liczniki

Jedno z najczęstszych zastosowań map:

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}

Spróbuj

Ćwiczenie#go.m4.l3.e1
Próby: 0Ładowanie...

Utwórz map[string]int z wartościami „a” -> 1 i „b” -> 2, a następnie dodaj „c” -> 3.

Ładowanie edytora...
Pokaż wskazówkę

Dosłownie: KODEF0.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m4.l3.e2
Próby: 0Ładowanie...

Użyj wzorca przecinek-ok, aby odczytać klucz „x” (nieobecny) w v, ok i wypisz oba.

Ładowanie edytora...
Pokaż wskazówkę

Dwie wartości zwracane: wartość i wartość logiczna obecności.

Rozwiązanie dostępne po 3 próbach

Quiz#go.m4.l3.e3
Gotowe

Co się stanie podczas pisania na mapie zerowej?

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

Podsumowanie

  • map[K]V: klucz-wartość, odwołanie, oparte na haszu.
  • Zainicjuj za pomocą make lub literału; zero map → panika przy zapisie.
  • v, ok := m[k] to jedyny sposób na odróżnienie „braku” od „wartości zerowej”.
  • delete(m, k) usuwa; ok, nawet jeśli k nie istnieje.
  • Iteracja range: randomizowana kolejność.
  • Klawisze: tylko porównywalne typy (bez plasterka/mapy/funkcji).
  • Wzór liczników: freq[k]++ wykorzystuje ukrytą wartość zerową.