00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.