В данном руководстве показано, как использовать оператор 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 каждый кейс завершается неявным разрывом, следовательно, нам не нужно писать его явно.
Рекомендуем вам супер 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.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»