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ść
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:
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:
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ć:
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:
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
Wypisz „feriale” dla lun/mar/mer/gio/ven, w przeciwnym razie „weekend”, używając przełącznika na wartości g.
Pokaż wskazówkę
Zgrupuj 5 dni tygodnia w jedną wielkość, oddzielając je przecinkami.
Rozwiązanie dostępne po 3 próbach
Użyj przełącznika BEZ warunku, aby wydrukować „neg”, „zero” lub „pos” w zależności od x.
Pokaż wskazówkę
Żadnego wyrażenia po `switch`, tylko `{`.
Rozwiązanie dostępne po 3 próbach
Co drukuje ten program?
switch 1 {
case 1:
fmt.Print("a")
case 2:
fmt.Print("b")
}Podsumowanie
caseakceptuje 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ńcuchif/else if.- Instrukcja init:
switch x := f(); { ... }, zakres ograniczony do bloku. fallthroughistnieje, 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).