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:
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30A menudo uno de los dos es suficiente:
// 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:
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.
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:
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:
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
Imprima el índice y el valor de cada elemento de nums usando for-range.
Solución disponible después de 3 intentos
Sume en total todos los valores de nums ignorando el índice.
Mostrar pista
Utilice `_` para descartar el índice.
Solución disponible después de 3 intentos
¿Qué representa la primera variable en `for k, v := range m` cuando m es un mapa?
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }Resumen
for k, v := range collcon 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().