0Pricing
Go Academy · Lekcja

Mapy: magazyny klucz-wartość

Tworzenie, odczytywanie, zapisywanie i usuwanie elementów mapy

Mapy: magazyny klucz-wartość to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Czym jest mapa

Mapa w języku Go to nieuporządkowana kolekcja par klucz-wartość. Klucze muszą być typem porównywalnym (np. łańcuchy znaków, liczby całkowite itp.). Mapy są typami referencyjnymi opartymi na tablicy mieszającej.

Tworzenie map

Należy użyć literału lub make:

package main
import "fmt"

func main() {
    ages  := map[string]int{"Alice": 30, "Bob": 25}
    cache := make(map[string]string)
    fmt.Println(ages, cache)
}

Odczytywanie i zapisywanie

Dostęp do wartości uzyskuje się za pomocą m[key], a przypisanie wykonuje za pomocą m[key] = value. Odczyt brakującego klucza zwraca wartość zerową:

package main
import "fmt"

func main() {
    m := map[string]int{}
    m["hits"] = 10
    m["hits"]++
    fmt.Println(m["hits"])    // 11
    fmt.Println(m["missing"]) // 0
}

Sprawdzanie istnienia klucza

Forma z dwiema wartościami pozwala odróżnić brakujący klucz od wartości zerowej:

package main
import "fmt"

func main() {
    m := map[string]int{"a": 0}
    v, ok := m["a"]
    fmt.Println(v, ok) // 0 true
    v2, ok2 := m["z"]
    fmt.Println(v2, ok2) // 0 false
}

Usuwanie wpisów

Należy użyć wbudowanej funkcji delete. Usunięcie nieistniejącego klucza nie powoduje żadnego działania:

package main
import "fmt"

func main() {
    m := map[string]int{"x": 1, "y": 2}
    delete(m, "x")
    delete(m, "z") // no-op
    fmt.Println(m) // map[y:2]
}

Iterowanie po mapie

Do iterowania należy użyć range. Kolejność nie jest gwarantowana:

package main
import "fmt"

func main() {
    scores := map[string]int{"Alice": 90, "Bob": 85}
    for name, score := range scores {
        fmt.Printf("%s: %d\n", name, score)
    }
}

Mapy z wartościami będącymi strukturami

Mapy mogą przechowywać struktury jako wartości. Aktualizację należy wykonywać za pomocą zmiennej tymczasowej (struktury w mapach nie są adresowalne):

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    points := map[string]Point{"A": {1, 2}}
    p := points["A"]
    p.X = 99
    points["A"] = p
    fmt.Println(points["A"]) // {99 2}
}

Mapy nil

Odczyt z mapy nil działa tak jak z pustej mapy (zwracane są wartości zerowe), ale zapis do mapy nil powoduje panikę:

package main

func main() {
    var m map[string]int
    _ = m["key"]   // ok — returns 0
    // m["key"] = 1 // PANIC: assignment to nil map
}

Mapy nie są bezpieczne we współbieżnym użyciu

Wbudowana mapa języka Go nie jest bezpieczna w użyciu współbieżnym. Współbieżne odczyty są bezpieczne, ale współbieżne zapisy (lub odczyt i zapis) wymagają muteksu albo sync.Map:

package main
import "sync"

func main() {
    var mu sync.Mutex
    m := map[string]int{}
    mu.Lock()
    m["key"] = 1
    mu.Unlock()
    _ = m
}

Zliczanie częstości występowania

Klasyczny wzorzec użycia mapy — zliczanie wystąpień:

package main
import "fmt"

func main() {
    words := []string{"go", "is", "fast", "go", "is", "go"}
    freq := map[string]int{}
    for _, w := range words {
        freq[w]++
    }
    fmt.Println(freq) // map[fast:1 go:3 is:2]
}

Szybkie sprawdzenie

Co się dzieje podczas odczytu nieistniejącego klucza z mapy języka Go?

Podsumowanie: mapy

Najważniejsze informacje:

  • Mapy to nieuporządkowane magazyny par klucz-wartość
  • Należy używać formy z dwiema wartościami, aby sprawdzać istnienie klucza
  • Nigdy nie należy zapisywać do mapy nil
  • Kolejność iteracji jest nieokreślona — w razie potrzeby należy sortować klucze
  • W kodzie współbieżnym mapy należy chronić muteksem

Zadanie praktyczne

Należy napisać funkcję, która przyjmuje ciąg znaków i zwraca map[rune]int zlicającą, ile razy występuje każdy znak. Należy przetestować ją z ciągiem "hello".

Często zadawane pytania

Czy lekcja „Mapy: magazyny klucz-wartość” jest bezpłatna?

Tak — pełny tekst „Mapy: magazyny klucz-wartość” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Mapy: magazyny klucz-wartość”?

Tworzenie, odczytywanie, zapisywanie i usuwanie elementów mapy Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Mapy: magazyny klucz-wartość”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tablice: kolekcje o stałej długości
  2. Slice: listy dynamiczne
  3. Mapy: magazyny klucz-wartość
  4. Iterowanie po kolekcjach za pomocą range
← Powrót do Go Academy