Ciclo For in Go
In Go esiste un solo costrutto per i cicli: il for. Non ci sono while o do-while come in altri linguaggi. Tuttavia, il for di Go e estremamente versatile e copre tutti i casi d’uso delle iterazioni. In questa guida vedremo tutte le sue forme.
Ciclo for Classico
La forma classica del for e composta da tre parti: inizializzazione, condizione e post-istruzione, separate da punto e virgola.
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println("Iterazione:", i)
}
}
Output:
Iterazione: 0
Iterazione: 1
Iterazione: 2
Iterazione: 3
Iterazione: 4
L’inizializzazione viene eseguita una sola volta prima dell’inizio del ciclo. La condizione viene valutata prima di ogni iterazione. La post-istruzione viene eseguita alla fine di ogni iterazione.
Ciclo for Stile While
Omettendo l’inizializzazione e la post-istruzione si ottiene un ciclo equivalente al while di altri linguaggi.
contatore := 0
for contatore < 10 {
fmt.Println(contatore)
contatore += 2
}
Questo forma e perfetta quando la condizione di terminazione non segue lo schema classico di inizializzazione/incremento.
Ciclo Infinito
Omettendo completamente la condizione si ottiene un ciclo infinito. Per uscire dal ciclo si usa l’istruzione break.
package main
import "fmt"
func main() {
somma := 0
for {
somma++
if somma >= 100 {
break
}
}
fmt.Println("Somma raggiunta:", somma)
}
I cicli infiniti sono comuni nei server, nei programmi che attendono input e nelle goroutine.
Ciclo for con range su Slice e Array
La parola chiave range permette di iterare su strutture dati. Su slice e array restituisce l’indice e il valore di ciascun elemento.
frutti := []string{"mela", "banana", "arancia", "uva"}
for indice, frutto := range frutti {
fmt.Printf("Indice %d: %s\n", indice, frutto)
}
Se non serve l’indice, si usa il blank identifier _:
for _, frutto := range frutti {
fmt.Println(frutto)
}
Se serve solo l’indice, si puo omettere la seconda variabile:
for i := range frutti {
fmt.Println("Indice:", i)
}
Ciclo for con range su Mappe
Su una mappa, range restituisce la chiave e il valore.
capitali := map[string]string{
"Italia": "Roma",
"Francia": "Parigi",
"Spagna": "Madrid",
}
for nazione, capitale := range capitali {
fmt.Printf("La capitale di %s e %s\n", nazione, capitale)
}
Nota: l’ordine di iterazione sulle mappe non e garantito in Go.
Ciclo for con range su Stringhe
Iterando su una stringa con range, Go restituisce l’indice del byte e il carattere Unicode (rune).
messaggio := "Ciao mondo"
for i, carattere := range messaggio {
fmt.Printf("Posizione %d: %c (Unicode: %U)\n", i, carattere, carattere)
}
Questa forma gestisce correttamente i caratteri multi-byte UTF-8.
break e continue
L’istruzione break interrompe il ciclo, mentre continue salta alla prossima iterazione.
for i := 0; i < 20; i++ {
if i%2 != 0 {
continue // Salta i numeri dispari
}
if i > 14 {
break // Interrompe il ciclo
}
fmt.Println(i)
}
Output:
0
2
4
6
8
10
12
14
Iterazione con Range su Interi (Go 1.22+)
A partire da Go 1.22, e possibile usare range direttamente su un valore intero per iterare da 0 fino a quel numero (escluso).
for i := range 5 {
fmt.Println(i) // Stampa 0, 1, 2, 3, 4
}
Questa sintassi semplifica i cicli in cui si deve iterare un numero specifico di volte.
Ciclo for con Piu Variabili
E possibile inizializzare e aggiornare piu variabili nel ciclo for.
for i, j := 0, 10; i < j; i, j = i+1, j-1 {
fmt.Printf("i=%d, j=%d\n", i, j)
}
Conclusione
Il ciclo for e l’unico costrutto iterativo in Go, ma grazie alle sue molteplici forme copre ogni esigenza: cicli classici, cicli condizionali, cicli infiniti e iterazione su strutture dati con range. La semplicita di avere un solo costrutto rende il linguaggio piu coerente e il codice piu leggibile.