Switch

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`