Przejdź do głównej treści
eLearner.app
Moduł 2 · Lekcja 4 z 59/50 w kursie~10 min
Lekcje modułu (4/5)

Idiomatyczny switch

switch Go jest bardziej ergonomiczny niż C/Java: każdy case ma swój własny ukryty blok (brak break do zapisania), możesz grupować wiele wartości z przecinkiem, a switch bez wyrażenia zachowuje się jak bardziej czytelny łańcuch if/else if.

Włącz wartość

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 akceptuje wiele wartości oddzielonych przecinkami i nie ma żadnych dorozumianych wartości fallthrough: gdy tylko sprawa zostanie wykonana, przełącznik kończy działanie.

Przełącznik bez warunku

Jeśli pominiesz wyrażenie, przełącznik zwróci wartość true i każdy case to a Warunek bool. Jest to idiomatyczna alternatywa dla długich łańcuchów 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")
}

Instrukcja inicjująca

Podobnie jak w przypadku if, switch akceptuje również instrukcję init:

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

n istnieje tylko wewnątrz przełącznika.

Jawny fallthrough

Jeśli naprawdę chcesz, aby wykonanie przypadło w następnym przypadku, musisz to napisać:

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
}

Przełącznik typu (podgląd)

Umożliwia rozróżnianie na podstawie typu dynamicznego interfejsu wartość. Omówimy to szczegółowo w module Interfejsy:

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

Spróbuj

Ćwiczenie#go.m2.l4.e1
Próby: 0Ładowanie...

Wypisz „feriale” dla lun/mar/mer/gio/ven, w przeciwnym razie „weekend”, używając przełącznika na wartości g.

Ładowanie edytora...
Pokaż wskazówkę

Zgrupuj 5 dni tygodnia w jedną wielkość, oddzielając je przecinkami.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m2.l4.e2
Próby: 0Ładowanie...

Użyj przełącznika BEZ warunku, aby wydrukować „neg”, „zero” lub „pos” w zależności od x.

Ładowanie edytora...
Pokaż wskazówkę

Żadnego wyrażenia po `switch`, tylko `{`.

Rozwiązanie dostępne po 3 próbach

Quiz#go.m2.l4.e3
Gotowe

Co drukuje ten program?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Opcje odpowiedzi

Podsumowanie

  • case akceptuje wiele wartości oddzielonych przecinkami.
  • Brak ukrytego błędu: każdy przypadek ma swój własny ukryty break.
  • switch { ... } bez wyrażenia = bardziej czytelny łańcuch if/else if.
  • Instrukcja init: switch x := f(); { ... }, zakres ograniczony do bloku.
  • fallthrough istnieje, ale jest rzadki; przechodzi do następnego przypadku BEZ oceny jego stanu.
  • Przełącznik typu v := i.(type), aby rozróżniać na podstawie typu dynamicznego (moduł Interfejsy).