Passer au contenu principal
eLearner.app
Module 2 · Leçon 4 sur 59/50 dans le cours~10 min
Leçons du module (4/5)

Switch idiomatique

Le switch de Go est plus ergonomique que celui de C/Java : chaque case a le son bloc implicite (pas de break à écrire), ils peuvent être regroupés plusieurs valeurs avec la virgule, et un switch sans expression se comporte comme une chaîne if/else if plus lisible.

Passer à une valeur

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

case accepte plusieurs valeurs séparées par des virgules et il n'y a pas de solution de secours implicit : dès qu'un cas est exécuté, le commutateur se termine.

Changer sans condition

Si vous omettez l'expression, le commutateur évalue true et chaque case est un état bool. C'est l'alternative idiomatique aux longues chaînes 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")
}

Instruction d'initialisation

Comme avec if, switch accepte également une instruction init :

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

n existe uniquement à l’intérieur du commutateur.

fallthrough explicite

Si vous voulez vraiment que l'exécution tombe dans le cas suivant, vous devez l'écrire :

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 de commutateur (notion)

Vous permet de faire une discrimination en fonction du type dynamique d'une valeur interface. Nous le verrons en profondeur dans le module Interfaces :

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)
}

Essayez-le vous-même

Exercice#go.m2.l4.e1
Tentatives : 0Chargement…

Imprimez 'weekday' pour lundi/mar/mer/jeu/ven, 'week-end' sinon, en utilisant un switch sur la valeur de g.

Chargement de l'éditeur…
Afficher l'indice

Regroupe les 5 jours de la semaine en un seul cas séparé par des virgules.

Solution disponible après 3 tentatives

Exercice#go.m2.l4.e2
Tentatives : 0Chargement…

Utilisez un commutateur INconditionnel pour imprimer « nég », « zéro » ou « pos » en fonction de x.

Chargement de l'éditeur…
Afficher l'indice

Aucune expression après `switch`, juste `{`.

Solution disponible après 3 tentatives

Quiz#go.m2.l4.e3
Prêt

Qu'imprime ce programme ?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Options de réponse

Récapitulatif

  • case accepte plusieurs valeurs séparées par une virgule.
  • Aucune solution implicite : chaque cas a son propre break implicite.
  • switch { ... } sans expression = chaîne if/else if plus lisible.
  • Instruction d'initialisation : switch x := f(); { ... }, portée limitée par blocs.
  • fallthrough existe mais est rare ; entre ensuite dans le dossier SANS évaluer son état.
  • Tapez le commutateur v := i.(type) pour discriminer en fonction du type dynamique (module Interfaces).