switch, case și default în Go

Alege una din mai multe ramuri după valoarea unei expresii sau după prima condiție adevărată.

Sintaxă
switch expresie {
case v1:
    ...
case v2, v3:
    ...
default:
    ...
}

switch {          // fără expresie: ca un lanț if/else
case x < 0:
    ...
}

Ce face switch, case și default

switch compară o valoare cu fiecare case, de sus în jos, și execută doar prima ramură care se potrivește. Spre deosebire de C sau Java, în Go nu trebuie break la final de ramură: execuția nu „cade” în ramura următoare. Dacă vrei asta explicit, folosești fallthrough.

Un case poate avea mai multe valori separate prin virgulă (case "sâmbătă", "duminică":). default se execută când nicio ramură nu se potrivește; poate sta oriunde, dar de obicei este la final.

switch fără expresie (switch {) are condiții în fiecare case și înlocuiește elegant un lanț lung de if/else if. Ca la if, poți pune o instrucțiune scurtă înainte: switch zi := azi(); zi {. Cuvintele case și default apar și în select și în type switch.

Parametri

Parametru Descriere
expresie Opțională. Valoarea comparată cu fiecare case; fără ea, fiecare case este o condiție bool.
case Una sau mai multe valori (sau condiții) separate prin virgulă.
default Opțional. Ramura executată când nu se potrivește niciun case.

Exemple

Exemplul 1: Mai multe valori într-un case

package main

import "fmt"

func tip(zi string) string {
    switch zi {
    case "sâmbătă", "duminică":
        return "weekend"
    case "luni", "marți", "miercuri", "joi", "vineri":
        return "zi lucrătoare"
    default:
        return "zi necunoscută"
    }
}

func main() {
    for _, z := range []string{"luni", "duminică", "joi", "sărbătoare"} {
        fmt.Printf("%-10s %s\n", z, tip(z))
    }
}

Rezultat

luni       zi lucrătoare
duminică   weekend
joi        zi lucrătoare
sărbătoare zi necunoscută

Exemplul 2: switch fără expresie

Fiecare case este o condiție; se alege prima adevărată.

package main

import "fmt"

func main() {
    for _, t := range []float64{-5, 8, 22, 35} {
        switch {
        case t < 0:
            fmt.Println(t, "°C: îngheț")
        case t < 15:
            fmt.Println(t, "°C: răcoare")
        case t < 30:
            fmt.Println(t, "°C: plăcut")
        default:
            fmt.Println(t, "°C: caniculă")
        }
    }
}

Rezultat

-5 °C: îngheț
8 °C: răcoare
22 °C: plăcut
35 °C: caniculă

Exemplul 3: Instrucțiune scurtă înaintea lui switch

rest există doar în switch.

package main

import "fmt"

func main() {
    for _, n := range []int{12, 7, 30} {
        switch rest := n % 3; rest {
        case 0:
            fmt.Println(n, "se împarte la 3")
        default:
            fmt.Println(n, "dă restul", rest, "la împărțirea cu 3")
        }
    }
}

Rezultat

12 se împarte la 3
7 dă restul 1 la împărțirea cu 3
30 se împarte la 3

Greșeli frecvente

  • Adăugarea lui break la final de case din obișnuința din C: nu este necesar.
  • Aceeași valoare constantă în două ramuri: duplicate case "luni" (constant of type string) in expression switch.
  • Așteptarea ca execuția să continue în ramura următoare: în Go trebuie scris explicit fallthrough.

Comenzi înrudite

  • fallthrough: Ultima instrucțiune dintr-un case: continuă cu ramura următoare fără să-i mai verifice condiția.
  • type switch: Un switch care alege ramura după tipul concret ținut de o interfață, cu variabila deja convertită.
  • select: Așteaptă mai multe operații pe canale deodată și o execută pe prima care este gata; cu default nu blochează.
  • if și else: Execută un bloc de cod doar dacă o condiție este adevărată; else tratează cazul contrar.