В данном руководстве показано, как использовать оператор switch
в Golang.
Содержание статьи
- Оператор switch в Go
- Пример использования оператора switch в Go
- Несколько выражений при работе с оператором switch в Go
- Оператор switch пример с default в Go
- Необязательный оператор при работе со switch в Go
- Оператор break в Go
- Оператор switch без выражения в Go
- Ключевое слово fallthrough в Go
- Использование type switch в Go
Оператор switch в Go
Оператор switch
в Go предоставляет возможность многостороннего выполнения. Спецификатор выражения или типа сравнивается с кейсам (случаями) внутри оператора switch
, чтобы определить, какую ветвь выполнить. В отличие от других языков вроде C, Java или PHP в Golang каждый кейс завершается неявным разрывом, следовательно, нам не нужно писать его явно.
![](https://golangify.com/wp-content/uploads/2020/04/go-read.png)
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Кейсы switch
выполняются сверху вниз, останавливаясь при успехе. Операторы switch
работают со значениями любого типа, не только integer.
Есть два типа операторов switch
: выражения и типы. Можно использовать запятые для разделения нескольких выражений в одном случае оператора. Оператор switch
без выражения является альтернативным способом выражения логики if/else.
Оператор по умолчанию default
можно использовать для выполняемой ветки, когда больше ничего не подходит. Он является необязательным.
Пример использования оператора switch в Go
Далее представлен пример использования оператора switch
в Go.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package main import ( "fmt" "time" ) func main() { switch time.Now().Weekday() { case time.Monday: fmt.Println("Сегодня понедельник.") case time.Tuesday: fmt.Println("Сегодня вторник.") case time.Wednesday: fmt.Println("Сегодня среда.") case time.Thursday: fmt.Println("Сегодня четверг.") case time.Friday: fmt.Println("Сегодня пятница.") case time.Saturday: fmt.Println("Сегодня суббота.") case time.Sunday: fmt.Println("Сегодня воскресенье.") } } |
В данном примере мы находим текущий день недели и выводим соответствующее сообщение.
1 |
switch time.Now().Weekday() { |
Оператор switch
принимает выражение, которое соответствует дню недели.
1 2 |
case time.Monday: fmt.Println("Сегодня понедельник.") |
Если день недели соответствует time.Monday
, выводится сообщение "Сегодня понедельник"
.
Несколько выражений в операторе switch в Go
Возможно поместить несколько выражений в одном кейсе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "time" "fmt" ) func main() { switch time.Now().Weekday() { case time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday: fmt.Println("будний день") case time.Saturday, time.Sunday: fmt.Println("выходные дни") } } |
Пример выводит день рабочей недели или выходной день в зависимости от нескольких выражений в операторах с двумя кейсами.
Оператор switch пример с default в Go
Оператор по умолчанию можно использовать для всех значений, которые не соответствуют указанным случаям.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package main import ( "fmt" ) func main() { size := "XXXL" switch size { case "XXS": fmt.Println("очень очень маленький") case "XS": fmt.Println("очень маленький") case "S": fmt.Println("маленький") case "M": fmt.Println("средний") case "L": fmt.Println("большой") case "XL": fmt.Println("очень большой") case "XXL": fmt.Println("очень очень большой") default: fmt.Println("неизвестно") } } |
Пример проверяет размеры одежды. Если используется не распознаваемое значение, в терминале выводится слово «неизвестно».
Необязательный оператор при работе со switch в Go
Необязательный оператор инициализатор может предшествовать выражению switch
. Инициализатор и выражение разделяются точкой с запятой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" ) func main() { switch num := 6; num % 2 == 0 { case true: fmt.Println("even value") case false: fmt.Println("odd value") } } |
В данном примере есть switch
инициализатор и выражение. Оператор switch
определяет, если значение четное или нечетное.
1 |
switch num := 6; num % 2 == 0 { |
num := 6
является switch инициализатором, а num % 2
switch выражением.
Оператор break в Go
Go использует неявный оператор break
для каждого случая. Это отличается от таких языков, как C или Java, где break
необходим. Если нужно, мы также можем явно указать break
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main import ( "fmt" ) func main() { w := "a b c\td\nefg hi" for _, e := range w { switch e { case ' ', '\t', '\n': break default: fmt.Printf("%c\n", e) } } } |
В данном примере мы выполняем цикл через строку, которая содержит различные символы. Выводятся всё кроме пробелов.
1 |
w := "a b c\td\nefg hi" |
У нас есть табуляция и символ перевода на новую строку.
1 |
for _, e := range w { |
Мы перебираем элементы строки с помощью range
цикла for
.
1 2 3 |
switch e { case ' ', '\t', '\n': break |
Если мы встречаем указанные три пробела, мы завершаем оператор switch
с помощью break
.
1 2 3 4 5 6 7 8 9 10 |
$ go run explicit_break.go a b c d e f g h i |
Таков результат вывода.
Оператор switch без выражения в Go
При использовании оператора switch
без выражения, это фактически равно выражению switch true
. Эту форму можно использовать вместо многострочных операторов if/else
для сокращения кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "time" "fmt" ) func main() { now := time.Now() switch { case now.Hour() < 12: fmt.Println("AM") default: fmt.Println("PM") } } |
В зависимости от текущего времени выводится AM или PM.
Ключевое слово fallthrough в switch
Для перехода к следующему кейсу можно использовать ключевое слово fallthrough
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package main import ( "fmt" ) // A -> B -> C -> D -> E func main() { nextstop := "B" fmt.Println("Stops ahead of us:") switch nextstop { case "A": fmt.Println("A") fallthrough case "B": fmt.Println("B") fallthrough case "C": fmt.Println("C") fallthrough case "D": fmt.Println("D") fallthrough case "E": fmt.Println("E") } } |
Представьте, что мы переходим от остановки A
к остановке Е
. Мы определяем, сколько остановок впереди нас на основании видимой остановки.
1 2 3 4 5 6 |
$ go run fallthrough.go Stops ahead of us: B C D E |
Таков результат вывода.
Использование type в switch
С помощью type
мы можем переключиться на тип значения интерфейса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package main import "fmt" func main() { var data interface{} data = 112523652346.23463246345 switch mytype:= data.(type) { case string: fmt.Println("string") case bool: fmt.Println("boolean") case float64: fmt.Println("float64 type") case float32: fmt.Println("float32 type") case int: fmt.Println("int") default: fmt.Printf("%T", mytype) } } |
В данном примере выводится тип данных значения.
1 2 |
case bool: fmt.Println("boolean") |
Для булева типа выводится "boolean"
.
1 2 |
$ go run type_switch.go float64 type |
Значение 112523652346.23463246345
принадлежит к типу float64.
В данном руководстве было рассмотрено использование оператора switch в Golang.
![](https://golangify.com/wp-content/uploads/2021/01/v.jpg)
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»