Direct naar de hoofdinhoud
Module 2 · Les 3 van 58/50 in de cursus~10 min
Modulelessen (3/5)

voor... bereik

for ... range is de idiomatische manier om collecties te herhalen: segmenten, arrays, kaarten, strings en kanalen. De syntaxis verandert enigszins afhankelijk van de collectie, maar het basispatroon is altijd hetzelfde: BESCHERMD_INLINE_5.

Bereik op segmenten en arrays

Retourneert index en kopie van de waarde:

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

Vaak is één van de twee voldoende:

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

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

Bereik op een kaart

Retourneert sleutel en waarde:

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

Bereik op een string: runen, geen bytes

for i, r := range s itereert per Unicode-codepunt (rune), niet per byte. De index i is de byte-offset van het begin van de rune.

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

Gebruik klassieke indexering om per byte te itereren:

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

Bereik op een kanaal

Herhaalt totdat het kanaal gesloten is:

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

We gaan dieper in op de Concurrency-module.

Probeer het

Oefening#go.m2.l3.e1
Pogingen: 0Laden…

Druk de index en waarde van elk element van nums af met behulp van for-range.

Editor laden…

Oplossing beschikbaar na 3 pogingen

Oefening#go.m2.l3.e2
Pogingen: 0Laden…

Tel alle waarden van nums bij elkaar op, waarbij de index wordt genegeerd.

Editor laden…
Toon hint

Gebruik `_` om de index te verwijderen.

Oplossing beschikbaar na 3 pogingen

Quiz#go.m2.l3.e3
Klaar

Wat vertegenwoordigt de eerste variabele in `for k, v := bereik m` als m een ​​afbeelding is?

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

Samenvatten

  • for k, v := range coll met duidelijke reikwijdte: gooi met _ weg wat u niet gebruikt.
  • Slice/array: index + COPY van de waarde. Om te muteren, indexeer.
  • Kaart: sleutel + waarde, volgorde gerandomiseerd bij elke run.
  • String: bereik itereert per rune (codepunt), niet per byte.
  • Kanaal: itereert terwijl het kanaal open is; gesloten met close().