Iterowanie i kolejność
Obsługuj losową kolejność map
Iterowanie i kolejność to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 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.
Iterowanie po mapie
Do iterowania po mapie, z pobieraniem każdego klucza i wartości, należy użyć range.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2}
for k, v := range m {
fmt.Println(k, v)
}
}Kolejność jest losowa
Kolejność iterowania po mapie nie jest gwarantowana. Go celowo ją losuje. Dwukrotne wykonanie tej samej pętli może wypisać klucze w różnej kolejności.
Dlaczego jest losowa
Go celowo losuje kolejność, aby programiści przypadkowo nie polegali na określonej kolejności. Kod zależny od kolejności elementów mapy prędzej czy później spowoduje błąd.
Tylko klucze
Aby iterować tylko po kluczach, należy pominąć wartość.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
for k := range m {
fmt.Println(k)
}
}Zbieranie kluczy
Aby uzyskać stabilny wynik, należy najpierw zebrać klucze do wycinka.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
keys := []string{}
for k := range m {
keys = append(keys, k)
}
fmt.Println("collected", len(keys), "keys")
}Sortowanie kluczy
Należy posortować zebrane klucze, a następnie iterować po wycinku. Zapewnia to deterministyczny wynik w uporządkowanej kolejności.
package main
import (
"fmt"
"sort"
)
func main() {
m := map[string]int{"c": 3, "a": 1, "b": 2}
keys := []string{}
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
}Wzorzec uporządkowanego wyniku
Wzorzec „zbierz, a następnie posortuj” to standardowy sposób wypisywania mapy w przewidywalnej kolejności. Gdy kolejność wyniku ma znaczenie, zawsze należy sortować klucze.
Sortowanie kluczy całkowitych
Ta sama metoda działa w przypadku kluczy liczbowych z użyciem sort.Ints.
package main
import (
"fmt"
"sort"
)
func main() {
m := map[int]string{3: "c", 1: "a", 2: "b"}
keys := []int{}
for k := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
}Modyfikowanie podczas iteracji
Podczas pętli range można bezpiecznie usuwać klucze. Dodawanie kluczy podczas iteracji ma jednak niezdefiniowane zachowanie; nowe wpisy mogą pojawić się w wyniku albo nie.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
for k := range m {
if k == "b" {
delete(m, k)
}
}
fmt.Println(len(m))
}Sortowanie według wartości
Aby uporządkować elementy według wartości zamiast klucza, należy zebrać klucze, a następnie posortować je za pomocą porównania odczytującego wartości z mapy.
package main
import (
"fmt"
"sort"
)
func main() {
m := map[string]int{"a": 3, "b": 1, "c": 2}
keys := []string{}
for k := range m {
keys = append(keys, k)
}
sort.Slice(keys, func(i, j int) bool {
return m[keys[i]] < m[keys[j]]
})
for _, k := range keys {
fmt.Println(k, m[k])
}
}Nigdy nie należy polegać na kolejności
Najważniejszy wniosek: nigdy nie należy zakładać określonej kolejności iterowania po mapie. Jeśli kolejność ma znaczenie, należy jawnie wyodrębnić klucze do wycinka i je posortować.
Szybkie sprawdzenie
Trzeba wypisać wpisy mapy w kolejności alfabetycznej kluczy. Jakie podejście jest prawidłowe?
Podsumowanie
Iterowanie i kolejność:
- Kolejność podczas range po mapie jest celowo losowa
- Należy zebrać klucze, posortować je, a następnie iterować, aby uzyskać deterministyczny wynik
- Usuwanie podczas range jest bezpieczne; dodawanie ma niezdefiniowane zachowanie
Często zadawane pytania
Czy lekcja „Iterowanie i kolejność” jest bezpłatna?
Tak — pełny tekst „Iterowanie i kolejność” 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 „Iterowanie i kolejność”?
Obsługuj losową kolejność map Ć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 4 z 4.
Ile czasu zajmuje lekcja „Iterowanie i kolejność”?
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
- Wewnętrzne działanie map
- Sprawdzanie istnienia
- Mapy jako zbiory
- Iterowanie i kolejność