Go by Example - IT: Switch

Gli switch esprimono condizionali attraverso più rami.

package main
import "fmt"
import "time"
func main() {

Ecco uno switch semplice.

    i := 2
    fmt.Print(i, " in lettere è ")
    switch i {
    case 1:
        fmt.Println("uno")
    case 2:
        fmt.Println("due")
    case 3:
        fmt.Println("tre")
    }

Puoi utilizzare le virgole per dividere più espressioni nella stessa dichiarazione case. In questo esempio utilizziamo anche il caso opzionale default, che viene eseguito nel caso l’espressione non possa essere valutata in nessuno dei rami precedenti.

    switch time.Now().Weekday() {
    case time.Saturday, time.Sunday:
        fmt.Println("siamo nel fine settimana")
    default:
        fmt.Println("oggi è un giorno feriale")
    }

Uno switch senza espressione è un metodo alternativo per esprimere la logica degli if/else. Qui vediamo anche come le espressioni dei case possono anche non essere costanti.

    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("non è ancora passato mezzogiorno")
    default:
        fmt.Println("è passato mezzogiorno")
    }

Nel caso volessimo fare cose differenti per una variabile di cui non conosciamo il tipo (ad esempio, una variabile interface{} che vedremo più avanti), possiamo utilizzare un type switch. In questo caso, stiamo prima convertendo la variabile v in una interface{}, dopo stiamo usando .(type) che segnala di usare il type switch.

    v := 3
    switch interface{}(v).(type) {
    case string:
        fmt.Println("v è di tipo `string`")
    case int:
        fmt.Println("v è di tipo `int`")
    default:
        fmt.Println("v è di un altro tipo ancora")
    }
}
$ go run switch.go
2 in lettere è due
siamo nel fine settimana
non è ancora passato mezzogiorno
v è di tipo `int`

Prossimo esempio: Array.