Lección 18 · 18 de 20
Recorrer con range · Go
Recorra slices, mapas y textos en Go con for y range: índice y valor, claves ordenadas con sort.Strings y runas para los caracteres.

range recorre una colección y da, en cada vuelta, dos valores. Con un slice son el índice y el valor: for i, t := range temps escribe cada día (i+1, porque el índice empieza en 0) y suma su temperatura. t es una copia: cambiarla no cambia el slice.
Con un mapa, range da la clave y el valor, pero en un orden aleatorio que puede cambiar en cada ejecución. Con una sola variable, for country := range capitals, se recibe solo la clave. Las claves se guardan, se ordenan con sort.Strings y luego se recorren con for _, country := range countries; el _ descarta el índice.
Un texto de Go es una secuencia de bytes en UTF-8, y una letra con tilde, como la á, ocupa dos. range sobre un texto no da bytes, sino runas (rune, un carácter Unicode), junto con la posición en bytes donde empieza cada una: por eso, tras 1:á, viene 3:l.
Así, len(city) da 7 bytes, mientras que len([]rune(city)), que convierte el texto en un slice de runas, da los 6 caracteres de Málaga. %c escribe una runa como carácter.
Código · main.go
package mainimport ( "fmt" "sort")func main() { // Over a slice: the index and a copy of each value. temps, sum := []float64{18.5, 21, 19.5, 23}, 0.0 for i, t := range temps { fmt.Printf("Day %d: %.1f\n", i+1, t) sum += t } fmt.Printf("Average: %.2f\n", sum/float64(len(temps))) // Over a map: key and value, in random order, so sort the keys. capitals := map[string]string{"Spain": "Madrid", "Italy": "Rome", "France": "Paris"} countries := make([]string, 0, len(capitals)) for country := range capitals { countries = append(countries, country) } sort.Strings(countries) for _, country := range countries { fmt.Println(country, "->", capitals[country]) } // Over a string: the byte position and each rune (character). city := "Málaga" for pos, r := range city { fmt.Printf("%d:%c ", pos, r) } fmt.Println("| bytes:", len(city), "runes:", len([]rune(city)))}Salida · go run main.go
Day 1: 18.5 Day 2: 21.0 Day 3: 19.5 Day 4: 23.0 Average: 20.50 France -> Paris Italy -> Rome Spain -> Madrid 0:M 1:á 3:l 4:a 5:g 6:a | bytes: 7 runes: 6
Para recordar
for i, v := range sliceda índice y valor.for k, v := range mapada clave y valor, en orden aleatorio._descarta el índice o la clave cuando no hacen falta.rangesobre un texto da runas, no bytes.len(s)cuenta bytes;len([]rune(s)), caracteres.
Ejercicio
Recorra con range el texto "Cádiz y León" y cuente cuántas vocales tiene, con tilde o sin ella, con un switch sobre cada runa.