Условный оператор switch

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

Синтаксис

goswitch expression {
case value1:
  // code
case value2:
  // code
default:
  // code
}

Блок default выполняется, если ни один из case не совпал. Этот блок необязателен.

Пример

Давайте проверим день недели по его номеру:

gopackage main

import "fmt"

func main() {
  day := 3

  switch day {
  case 1:
    fmt.Println("Monday")
  case 2:
    fmt.Println("Tuesday")
  case 3:
    fmt.Println("Wednesday")
  case 4:
    fmt.Println("Thursday")
  case 5:
    fmt.Println("Friday")
  default:
    fmt.Println("Weekend")
  }
}

Результат выполнения кода:

go"Wednesday"

В этом примере переменная day содержит число 3, поэтому выполняется блок с case 3.

Пример

Оператор switch может использоваться с несколькими значениями в одном case через запятую:

gopackage main

import "fmt"

func main() {
  letter := "b"

  switch letter {
  case "a", "e", "i", "o", "u":
    fmt.Println("Vowel")
  default:
    fmt.Println("Consonant")
  }
}

Результат выполнения кода:

go"Consonant"

В этом примере проверяется, является ли буква гласной. Буква b не входит в список гласных, поэтому выполняется блок default.

Пример

Оператор switch без выражения работает как цепочка условий if-else:

gopackage main

import "fmt"

func main() {
  num := 42

  switch {
  case num < 0:
    fmt.Println("Negative")
  case num == 0:
    fmt.Println("Zero")
  case num > 0:
    fmt.Println("Positive")
  }
}

Результат выполнения кода:

go"Positive"

Такой синтаксис удобен, когда нужно проверить различные условия без указания конкретного выражения для сравнения.

Пример

В switch можно инициализировать переменную в самом операторе:

gopackage main

import "fmt"

func main() {
  switch num := 10; {
  case num%2 == 0:
    fmt.Println("Even")
  default:
    fmt.Println("Odd")
  }
}

Результат выполнения кода:

go"Even"

Переменная num объявлена и инициализирована прямо в операторе switch и доступна только внутри него.

Смотрите также

  • оператор if,
    который выполняет условное ветвление
  • оператор else,
    который задает альтернативную ветку для if
  • оператор fallthrough,
    который позволяет проваливаться в следующий case
  • оператор goto,
    который выполняет безусловный переход к метке