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:
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30Vaak is één van de twee voldoende:
// 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:
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.
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:
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:
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
Druk de index en waarde van elk element van nums af met behulp van for-range.
Oplossing beschikbaar na 3 pogingen
Tel alle waarden van nums bij elkaar op, waarbij de index wordt genegeerd.
Toon hint
Gebruik `_` om de index te verwijderen.
Oplossing beschikbaar na 3 pogingen
Wat vertegenwoordigt de eerste variabele in `for k, v := bereik m` als m een afbeelding is?
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }Samenvatten
for k, v := range collmet 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().