Lekcje modułu (3/5)
for...range
for ... range to idiomatyczny sposób iteracji po kolekcjach:
plasterki, tablice, mapy, ciągi znaków i kanały. Składnia zmienia się nieznacznie
w zależności od kolekcji, ale wzór bazowy jest zawsze ten sam:
KODEF1.
Zakres plasterków i tablic
Zwraca indeks i kopię wartości:
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30Często wystarczy jeden z dwóch:
// solo indice
for i := range nums { _ = i }
// solo valore (ignora indice con _)
for _, v := range nums { _ = v }Zasięg na mapie
Zwraca klucz i wartość:
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
fmt.Println(k, v)
}Zakres w łańcuchu: runy, nie bajty
for i, r := range s iteruje według punktu kodowego Unicode (runa), a nie według
bajt. Indeks i jest przesunięciem bajtowym początku runy.
for i, r := range "èé" {
fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)Aby iterować po bajcie, użyj klasycznego indeksowania:
s := "ciao"
for i := 0; i < len(s); i++ {
fmt.Println(s[i]) // byte (uint8)
}Zasięg na kanale
Iteruje, aż kanał zostanie zamknięty:
ch := make(chan int)
go func() {
for i := 0; i < 3; i++ { ch <- i }
close(ch)
}()
for v := range ch {
fmt.Println(v)
}Zajmiemy się głębiej w module Współbieżność.
Spróbuj
Wydrukuj indeks i wartość każdego elementu liczb za pomocą for-range.
Rozwiązanie dostępne po 3 próbach
Zsumuj wszystkie wartości liczb, ignorując indeks.
Pokaż wskazówkę
Użyj `_`, aby odrzucić indeks.
Rozwiązanie dostępne po 3 próbach
Co oznacza pierwsza zmienna w `for k, v := range m`, gdy m jest mapą?
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }Podsumowanie
for k, v := range collz wyraźnym zakresem: odrzuć za pomocą_to, czego nie używasz.- Kawałek/tablica: indeks + KOPIA wartości. Aby zmutować, indeksuj.
- Mapa: klucz + wartość, kolejność losowa przy każdym uruchomieniu.
- String: zakres iteruje po runie (punkt kodowy), a nie po bajcie.
- Kanał: iteruje, gdy kanał jest otwarty; zamknięte za pomocą
close().