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
breakla final decasedin 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.