Saltar al contenido principal
eLearner.app
Módulo 2 · Lección 3 de 58/50 en el curso~10 min
Lecciones del módulo (3/5)

for...range

for ... range è il modo idiomatico per iterare su collezioni: slice, array, map, string e channel. La sintassi cambia leggermente in base alla collezione, ma il pattern di base è sempre lo stesso: for chiave, valore := range coll { ... }.

Range su slice e array

Ritorna indice e copia del valore:

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

Spesso uno dei due ti basta:

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

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

Range su map

Ritorna chiave e valore:

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

Range su string: rune, non byte

for i, r := range s itera per code point Unicode (rune), non per byte. L'indice i è il byte offset di inizio del rune.

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

Per iterare per byte usa l'indicizzazione classica:

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

Range su channel

Itera finché il channel non viene chiuso:

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

Approfondiremo nel modulo Concorrenza.

Prova tu

Ejercicio#go.m2.l3.e1
Intentos: 0Cargando...

Stampa indice e valore di ogni elemento di nums usando for-range.

Cargando editor...

Solución disponible después de 3 intentos

Ejercicio#go.m2.l3.e2
Intentos: 0Cargando...

Somma in total tutti i valori di nums ignorando l'indice.

Cargando editor...
Mostrar pista

Usa `_` per scartare l'indice.

Solución disponible después de 3 intentos

Cuestionario#go.m2.l3.e3
Listo

Cosa rappresenta la prima variabile in `for k, v := range m` quando m è una map?

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

Recap

  • for k, v := range coll con scope chiaro: scarta con _ ciò che non usi.
  • Slice/array: indice + COPIA del valore. Per mutare, indicizza.
  • Map: chiave + valore, ordine randomizzato a ogni run.
  • String: range itera per rune (code point), non per byte.
  • Channel: itera finché il channel è aperto; si chiude con close().