Salt la conținutul principal
Modulul 2 · Lecția 4 din 59/50 în curs~10 min
Lecții din modul (4/5)

Comutator idiomatic

switch Go este mai ergonomic decât C/Java: fiecare case are propriul bloc implicit (fără break de scris), puteți grupa valori multiple cu virgulă și un switch fără o expresie se comportă ca un lanț if/else if mai lizibil.

Porniți o valoare

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 acceptă mai multe valori separate prin virgule și nu există niciun implicit fallthrough: de îndată ce un caz este executat, comutatorul iese.

Comutați fără condiție

Dacă omiteți expresia, comutatorul evaluează true și fiecare case este un bool stare. Este alternativa idiomatică la lanțurile lungi 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")
}

Declarație inițială

Ca și în cazul if, switch acceptă și o instrucțiune init:

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

n există numai în interiorul comutatorului.

fallthrough explicit

Dacă doriți cu adevărat ca execuția să cadă în cazul următor, trebuie să scrieți:

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
}

Comutator de tip (previzualizare)

Vă permite să discriminați în funcție de tipul dinamic al unei interfețe valoare. O vom acoperi în profunzime în modulul Interfețe:

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

Încearcă

Exercițiu#go.m2.l4.e1
Încercări: 0Se încarcă…

Tipăriți „feriale” pentru lun/mar/mer/gio/ven, „weekend” în caz contrar, folosind un comutator pe valoarea lui g.

Se încarcă editorul...
Afișează indiciu

Grupați cele 5 zile lucrătoare într-un singur caz, separate prin virgule.

Soluție disponibilă după 3 încercări

Exercițiu#go.m2.l4.e2
Încercări: 0Se încarcă…

Utilizați un comutator FĂRĂ o condiție pentru a imprima „neg”, „zero” sau „pos” în funcție de x.

Se încarcă editorul...
Afișează indiciu

Nicio expresie după `switch`, doar `{`.

Soluție disponibilă după 3 încercări

Quiz#go.m2.l4.e3
Gata

Ce imprimă acest program?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Opțiuni de răspuns

Recapitulare

  • case acceptă mai multe valori separate prin virgulă.
  • Fără cădere implicită: fiecare caz are propriul său break implicit.
  • switch { ... } fără o expresie = un lanț if/else if mai lizibil.
  • Instrucțiunea inițială: switch x := f(); { ... }, sfera de aplicare limitată la bloc.
  • fallthrough există, dar este rar; intră în cazul următor FĂRĂ a evalua starea acestuia.
  • Tastați comutatorul v := i.(type) pentru a discrimina în funcție de tipul dinamic (modulul Interfețe).