Przejdź do głównej treści
eLearner.app
Moduł 2 · Lekcja 3 z 58/50 w kursie~10 min
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:

Go
nums := []int{10, 20, 30}
for i, v := range nums {
    fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30

Często wystarczy jeden z dwóch:

Go
// 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ść:

Go
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.

Go
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:

Go
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:

Go
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

Ćwiczenie#go.m2.l3.e1
Próby: 0Ładowanie...

Wydrukuj indeks i wartość każdego elementu liczb za pomocą for-range.

Ładowanie edytora...

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m2.l3.e2
Próby: 0Ładowanie...

Zsumuj wszystkie wartości liczb, ignorując indeks.

Ładowanie edytora...
Pokaż wskazówkę

Użyj `_`, aby odrzucić indeks.

Rozwiązanie dostępne po 3 próbach

Quiz#go.m2.l3.e3
Gotowe

Co oznacza pierwsza zmienna w `for k, v := range m`, gdy m jest mapą?

Go
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }
Opcje odpowiedzi

Podsumowanie

  • for k, v := range coll z 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().