0Pricing
Go Academy · Lekcja

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

  1. Wewnętrzne działanie map
  2. Sprawdzanie istnienia
  3. Mapy jako zbiory
  4. Iterowanie i kolejność
← Powrót do Go Academy