Інструкція switch обчислює вираз і запускає перший case, що збігається з його значенням.
Часто це чистіша альтернатива довгим ланцюжкам if ... else if.
operatingSystem := "windows"
switch operatingSystem {
case "windows":
// do something if the operating system is windows
case "linux":
// do something if the operating system is linux
case "macos":
// do something if the operating system is macos
default:
// do something if the operating system is none of the above
}
Кілька значень можна обʼєднати в один case через кому.
case збігається, якщо вираз дорівнює будь-якому з них:
switch operatingSystem {
case "windows", "linux":
// do something if the operating system is windows or linux
case "macos":
// do something if the operating system is macos
default:
// do something if the operating system is none of the above
}
switch без виразуВираз після switch можна й зовсім пропустити.
Тоді кожен case містить булевий вираз, і виконується перший із них, що обчислюється як true.
age := 21
switch {
case age > 20 && age < 30:
// do something if age is between 20 and 30
case age == 10:
// do something if age is equal to 10
default:
// do something else for every other case
}
Як і if, switch може містити коротку інструкцію ініціалізації перед виразом.
Змінні, оголошені там, мають область видимості в межах блоку switch:
switch v := getValue(); {
case v < 0:
// do something if v is less than 0
case v == 0:
// do something if v is 0
default:
// do something else for every other case
}
// v will not be accessible here
fallthroughfallthrough змушує виконати тіло наступного case незалежно від того, чи збігається його вираз.
Він має бути останньою інструкцією в тілі case, і після нього має бути наступний case.
fallthrough рідко трапляється в ідіоматичному Go, бо робить сусідні case залежними один від одного.
Через це окремі case важче аналізувати ізольовано, а сам switch стає важче читати.
Коли кілька case мають поводитися однаково, зрозуміліше обʼєднати їх через кому.
Якщо ж логіка спільна для кількох case з інших причин, варто винести її в допоміжну функцію.
s := "hello"
switch s {
case "hello":
fmt.Println("hello")
fallthrough
case "world":
fmt.Println("world") // also runs, even though s != "world"
}
// Output:
// hello
// world
Щоб дізнатися більше, зазирніть до Go by Example: Switch або до специфікації мови Go.