Direkt zum Hauptinhalt springen
eLearner.app
Modul 2 · Lektion 3 von 58/50 im Kurs~10 min
Lektionen des Moduls (3/5)

for...range

for ... range ist die idiomatische Methode zum Durchlaufen von Sammlungen: Slices, Arrays, Maps, Strings und Kanäle. Die Syntax ändert sich geringfügig je nach Kollektion, das Grundmuster ist jedoch immer das gleiche: for key, value := range coll { ... }.

Bereich für Slices und Arrays

Gibt Index und Kopie des Werts zurück:

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

Oft reicht eines von beiden:

Go
// solo indice
for i := range nums { _ = i }

// solo valore (ignora indice con _)
for _, v := range nums { _ = v }

Bereich auf einer Karte

Gibt Schlüssel und Wert zurück:

Go
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
    fmt.Println(k, v)
}

Bereich einer Zeichenfolge: Runen, keine Bytes

for i, r := range s iteriert pro Unicode-Codepunkt (Rune), nicht pro Byte. Der Index i ist der Byte-Offset des Runenanfangs.

Go
for i, r := range "èé" {
    fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)

Um pro Byte zu iterieren, verwenden Sie die klassische Indizierung:

Go
s := "ciao"
for i := 0; i < len(s); i++ {
    fmt.Println(s[i])  // byte (uint8)
}

Bereich auf einem Kanal

Iteriert, bis der Kanal geschlossen ist:

Go
ch := make(chan int)
go func() {
    for i := 0; i < 3; i++ { ch <- i }
    close(ch)
}()
for v := range ch {
    fmt.Println(v)
}

Wir werden tiefer in das Concurrency-Modul eintauchen.

Probieren Sie es aus

Übung#go.m2.l3.e1
Versuche: 0Wird geladen…

Geben Sie den Index und den Wert jedes Elements von Nums mithilfe von for-range aus.

Editor wird geladen…

Lösung nach 3 Versuchen verfügbar

Übung#go.m2.l3.e2
Versuche: 0Wird geladen…

Summiere alle Zahlenwerte und ignoriere dabei den Index.

Editor wird geladen…
Hinweis anzeigen

Verwenden Sie `_`, um den Index zu verwerfen.

Lösung nach 3 Versuchen verfügbar

Quiz#go.m2.l3.e3
Bereit

Was stellt die erste Variable in `for k, v := range m` dar, wenn m eine Karte ist?

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

Zusammenfassung

  • for k, v := range coll mit klarem Geltungsbereich: Verwerfen Sie mit _, was Sie nicht verwenden.
  • Slice/Array: Index + KOPIE des Werts. Um zu mutieren, indizieren.
  • Karte: Schlüssel + Wert, Reihenfolge zufällig bei jedem Lauf. – String: Bereich iteriert pro Rune (Codepunkt), nicht pro Byte.
  • Kanal: iteriert, solange der Kanal geöffnet ist; geschlossen mit close().