Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Оператор выбора 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