логотип PurpleSchool
логотип PurpleSchool

Switch в Go

Автор

Александр Гольцман

Конструкция switch в языке программирования Go (или Golang) — это мощный инструмент для выбора одного из множества вариантов, в зависимости от значения переменной или выражения. Это удобно, когда необходимо обработать несколько возможных вариантов без использования множества вложенных if. В этой статье я расскажу о том, как работает switch в Go, покажу основные особенности и приведу примеры его использования.

Что такое switch в Go?

Конструкция switch в Go позволяет выполнить различные блоки кода в зависимости от значений переменных. Это удобный способ для обработки множества возможных вариантов. Вместо того чтобы использовать длинные цепочки if-else, switch позволяет выразить логику гораздо более компактно и читаемо.

Основная структура выглядит следующим образом:

switch variable {
case value1:
    // блок кода для value1
case value2:
    // блок кода для value2
default:
    // блок кода по умолчанию
}

Внутри switch у вас могут быть несколько вариантов case. Каждый case проверяет, соответствует ли значение переменной заданному значению. Если оно совпадает, выполняется соответствующий блок кода. Если ни одно из значений не совпало, выполняется блок default (если он присутствует).

Простой пример использования switch

Давайте начнем с простого примера, чтобы понять, как работает switch в Go:

package main

import "fmt"

func main() {
    day := "пятница"

    switch day {
    case "понедельник":
        fmt.Println("Начало недели")
    case "пятница":
        fmt.Println("Конец недели")
    default:
        fmt.Println("Обычный день")
    }
}

В этом коде переменная day содержит строку "пятница". В блоке switch происходит проверка на соответствие каждому значению. В данном случае будет выведено:

Конец недели

Обратите внимание, что конструкция switch сама по себе завершает выполнение, как только один из блоков case выполнится. То есть, если совпало значение с "пятница", другие блоки проверяться не будут.

Без явного выражения в switch

В Go конструкция switch может работать и без явного выражения. Это полезно, когда вам нужно выполнить проверку нескольких условий с использованием логики, а не значений переменных. Рассмотрим пример:

package main

import "fmt"

func main() {
    x := 10

    switch {
    case x < 5:
        fmt.Println("x меньше 5")
    case x < 15:
        fmt.Println("x меньше 15")
    default:
        fmt.Println("x больше или равно 15")
    }
}

Здесь не указывается переменная после switch. Вместо этого каждый case проверяет определенное условие. В нашем случае, так как x = 10, будет выведено:

x меньше 15

Обработка нескольких значений в одном case

С помощью switch можно объединить несколько значений в одном case, используя запятую. Это удобно, когда нужно выполнить одинаковое действие для нескольких значений:

package main

import "fmt"

func main() {
    fruit := "яблоко"

    switch fruit {
    case "яблоко", "груша":
        fmt.Println("Это фрукт")
    case "морковь":
        fmt.Println("Это овощ")
    default:
        fmt.Println("Неизвестный продукт")
    }
}

В этом примере оба значения "яблоко" и "груша" попадут под один блок case, и будет выведено:

Это фрукт

Переключение на несколько блоков с использованием fallthrough

По умолчанию, как только выполняется один из блоков case, программа выходит из switch. Однако, если вы хотите, чтобы выполнение продолжалось в следующий блок case, можно использовать ключевое слово fallthrough.

package main

import "fmt"

func main() {
    number := 2

    switch number {
    case 1:
        fmt.Println("Один")
        fallthrough
    case 2:
        fmt.Println("Два")
        fallthrough
    case 3:
        fmt.Println("Три")
    }
}

В этом примере, благодаря fallthrough, выполнение продолжится от блока case 2 до блока case 3, и будет выведено:

Два
Три

Заключение

Конструкция switch в Go — это мощный и гибкий инструмент для выбора различных вариантов выполнения кода. Она позволяет обрабатывать множество условий без необходимости в длинных цепочках if-else, делает код более читаемым и компактным.

Какие особенности стоит учитывать при использовании switch в Go:

  1. Проверка значений — в классическом switch выражение проверяется на совпадение с возможными значениями в case.
  2. Без выражения — можно использовать switch без явного выражения для проверки условий в каждом case.
  3. Обработка нескольких значений — с помощью запятой можно объединить несколько значений в одном case.
  4. Использование fallthrough — позволяет продолжить выполнение в следующий блок case, что не является стандартным поведением.
Стрелочка влевоИспользование tag в структурах GolangСтроки в GolangСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний