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
- Tablice: kolekcje o stałej długości
- Slice: listy dynamiczne
- Mapy: magazyny klucz-wartość
- Iterowanie po kolekcjach za pomocą range