Range
Il costrutto range
è un iteratore su una struttura dati, sia essa un array, slice o map.
Equivale al comando foreach
di altri linguaggi.
Esempio
(11orange.go):
package main
import "fmt"
func main() {
// range è un iteratore su collezioni = foreach
// ritorna due valori
// Sugli array il secondo è il valore dell'elemento
nums := []int{2, 3, 4}
sum := 0
// Ignoriamo il primo valore col segnaposto _
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
// Su array e slice il primo valore è l'indice
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
// Sulle map il primo valore è la chiave
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
// Un carattere di una stringa si chiama runa
// Con range sulle stringhe il primo è l'indice di runa
// e il secondo è il valore Unicode della runa
string1 := "golang"
fmt.Print(string1, "= ")
for i, c := range string1 {
fmt.Print(i, ": ", c, ", ")
}
fmt.Println()
// Giappone
string3 := "日本国"
fmt.Print(string3, "= ")
for i, c := range string3 {
fmt.Print(i, ": ", c, ", ")
}
fmt.Println()
// Egitto
string4 := "مَصر"
fmt.Print(string4, "= ")
for i, c := range string4 {
fmt.Print(i, ": ", c, ", ")
}
fmt.Println()
// NB Il trattamento stringhe funziona su tutto Unicode
// ma il display dipende dalla disponibilità del font
}