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 es la forma idiomática de iterar sobre colecciones: cortes, matrices, mapas, cadenas y canales. La sintaxis cambia ligeramente. dependiendo de la colección, pero el patrón base es siempre el mismo: CÓDIGOPH1.

Rango en cortes y matrices

Devuelve índice y copia del valor:

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

A menudo uno de los dos es suficiente:

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

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

Rango en un mapa

Devuelve clave y valor:

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

Rango en una cadena: runas, no bytes

for i, r := range s itera por punto de código Unicode (runa), no por byte. El índice i es el desplazamiento de bytes del inicio de la runa.

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

Para iterar por byte utilice la indexación clásica:

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

Rango en un canal

Itera hasta que el canal se cierra:

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

Profundizaremos en el módulo de Concurrencia.

Pruébalo

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

Imprima el índice y el valor de cada elemento de nums usando for-range.

Cargando editor...

Solución disponible después de 3 intentos

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

Sume en total todos los valores de nums ignorando el índice.

Cargando editor...
Mostrar pista

Utilice `_` para descartar el índice.

Solución disponible después de 3 intentos

Cuestionario#go.m2.l3.e3
Listo

¿Qué representa la primera variable en `for k, v := range m` cuando m es un mapa?

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

Resumen

  • for k, v := range coll con alcance claro: descarta con _ lo que no utilices.
  • Sector/matriz: índice + COPIA del valor. Para mutar, indexar.
  • Mapa: clave + valor, orden aleatorio en cada ejecución.
  • Cadena: el rango se itera por runa (punto de código), no por byte.
  • Canal: itera mientras el canal está abierto; cerrado con close().