Vai al contenuto
eLearner.app
Modulo 2 · Lezione 4 di 59/50 nel corso~10 min
Lezioni del modulo (4/5)

switch idiomatico

Lo switch di Go è più ergonomico di quello C/Java: ogni case ha il suo blocco implicito (niente break da scrivere), si possono raggruppare più valori con la virgola, e un switch senza espressione si comporta come una catena if/else if più leggibile.

Switch su un valore

Go
giorno := "mar"
switch giorno {
case "lun", "mar", "mer", "gio", "ven":
    fmt.Println("feriale")
case "sab", "dom":
    fmt.Println("weekend")
default:
    fmt.Println("sconosciuto")
}

I case accettano più valori separati da virgola e non c'è fallthrough implicito: appena un case è eseguito, lo switch esce.

Switch senza condizione

Se ometti l'espressione, lo switch valuta true e ogni case è una condizione bool. È l'alternativa idiomatica a lunghe catene if/else if:

Go
switch {
case x < 0:
    fmt.Println("negativo")
case x == 0:
    fmt.Println("zero")
case x < 10:
    fmt.Println("piccolo")
default:
    fmt.Println("grande")
}

Init statement

Come per if, anche switch accetta uno statement di init:

Go
switch n := len(s); {
case n == 0:
    fmt.Println("vuoto")
case n > 100:
    fmt.Println("lungo")
default:
    fmt.Println("ok")
}

n esiste solo dentro lo switch.

fallthrough esplicito

Se vuoi davvero che l'esecuzione cada nel case successivo, devi scriverlo:

Go
switch 1 {
case 1:
    fmt.Println("uno")
    fallthrough
case 2:
    fmt.Println("due")  // anche questo viene stampato
case 3:
    fmt.Println("tre")  // questo no
}

Type switch (cenno)

Permette di discriminare in base al tipo dinamico di un valore di interfaccia. Lo vedremo a fondo nel modulo Interfacce:

Go
var i interface{} = "ciao"
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("tipo %T\n", v)
}

Prova tu

Esercizio#go.m2.l4.e1
Tentativi: 0Caricamento…

Stampa 'feriale' per lun/mar/mer/gio/ven, 'weekend' altrimenti, usando uno switch sul valore di g.

Caricamento editor…
Mostra suggerimento

Raggruppa i 5 giorni feriali in un unico case separato da virgole.

Soluzione disponibile dopo 3 tentativi

Esercizio#go.m2.l4.e2
Tentativi: 0Caricamento…

Usa uno switch SENZA condizione per stampare 'neg', 'zero' o 'pos' a seconda di x.

Caricamento editor…
Mostra suggerimento

Niente espressione dopo `switch`, solo `{`.

Soluzione disponibile dopo 3 tentativi

Quiz#go.m2.l4.e3
Pronto

Cosa stampa questo programma?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Opzioni di risposta

Recap

  • case accettano valori multipli separati da virgola.
  • Niente fallthrough implicito: ogni case ha il suo break implicito.
  • switch { ... } senza espressione = catena if/else if più leggibile.
  • Init statement: switch x := f(); { ... }, scope limitato al blocco.
  • fallthrough esiste ma è raro; entra nel case dopo SENZA valutarne la condizione.
  • Type switch v := i.(type) per discriminare in base al tipo dinamico (modulo Interfacce).