cpp

Оператор выбора switch

Оператор выбора switch имеет следующий формат:

switch [<Инструкция>; ]<Выражение> {
case <Значение 1>:
   <Инструкции>
[...
case <Значение N>:
   <Инструкции>]
[default:
   <Инструкции>]
}

Вместо условия оператор switch принимает выражение. В зависимости от значения выражения выполняется один из блоков case, в котором указано это значение. Если ни одно из значений не описано в блоках case, то выполняется блок default (если он указан). Обратите внимание на то, что значения в блоках case не могут иметь одинаковые значения. В параметре <Инструкция> можно объявить переменную, которая будет видна только внутри оператора switch. Пример использования оператора switch приведен в листинге 3.4.

Листинг 3.4. Использование оператора switch

package main

import (
   "fmt"
   "os"
)

func main() {
   var x int = 0
   fmt.Print(`Какой операционной системой вы пользуетесь?
1 - Windows XP
2 - Windows 8
3 - Windows 10
4 - Другая

Введите число, соответствующее ответу: `)
   if _, err := fmt.Scanln(&x); err != nil {
      fmt.Fprintln(os.Stderr, "Вы ввели не число")
      return
   }
   switch x {
   case 1:
      fmt.Println("Вы выбрали - Windows XP")
   case 2:
      fmt.Println("Вы выбрали - Windows 8")
   case 3:
      fmt.Println("Вы выбрали - Windows 10")
   case 4:
      fmt.Println("Вы выбрали – Другая")
   default:
      fmt.Println("Мы не смогли определить систему")
   }
}

В блоке case можно указать сразу несколько значений через запятую:

switch x := 2; x {
case 1, 2, 3:
   fmt.Println("1, 2 или 3")
case 4, 5:
   fmt.Println("4 или 5")
default:
   fmt.Println("Другое значение")
}

Во многих языках программирования для завершения инструкций внутри блока case нужно использовать оператор break. Этот оператор позволяет досрочно выйти из оператора выбора switch. Если не указать оператор break, то будет выполняться следующий блок case вне зависимости от указанного значения. В языке Go это не так. Использовать оператор break для выхода из блока case не нужно, никакого "провала" в следующий блок case не будет. Тем не менее, оператор break при необходимости можно использовать для досрочного выхода из switch:

switch x := 1; x {
case 1:
   fmt.Println("1")
   break // Выходим из switch
   fmt.Println("Эта инструкция выполнена не будет")
default:
   fmt.Println("Другое значение")
}

Если же хотите "провалиться" в следующий блок case, то нужно явным образом вызвать оператор fallthrough:

switch x := 1; x {
case 1:
   fmt.Println("1")
   fallthrough
case 2:
   fmt.Println("2")
default:
   fmt.Println("Другое значение")
}

Результат:

1
2

Существует также следующий формат оператора выбора switch:

switch [<Инструкция>; ] {
case <Условие 1>:
   <Инструкции>
[...
case <Условие N>:
   <Инструкции>]
[default:
   <Инструкции>]
}

Пример:

switch x := 1; {
case x == 1:
   fmt.Println("1")
case x == 2:
   fmt.Println("2")
default:
   fmt.Println("Другое значение")
}

Еще один формат оператора switch:

switch [<Переменная 2> := ]<Переменная 1>.(type) {
case <Тип 1>:
   <Блок, выполняемый, если тип соответствует типу <Тип 1>>
case <Тип N>:
   <Блок, выполняемый, если тип соответствует типу <Тип N>>
default:
   <Если другой тип>
}

В зависимости от типа переменной <Переменная 1> будет выполнен один из блоков case, тип которого совпадает. Через переменную <Переменная 2> внутри блоков case доступно значение после преобразования типа. Если не один из блоков case не совпадает с типом, то выполняется блок default. Внутри блока default переменная <Переменная 2> будет иметь тип interface{}. Пример:

var x interface{} = 15.4
switch v := x.(type) {
case int:
   fmt.Println("int:", v)
   var y int = v
   fmt.Println("y =", y)
case float64:
   fmt.Println("float64:", v)
   var y float64 = v
   fmt.Println("y =", y)
default:
   fmt.Println("Другой тип")
}

Результат:

float64: 15.4
y = 15.4

Если первую строку изменить следующим образом:

var x interface{} = 15

то результат будет таким:

int: 15
y = 15

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF