134 lines
4.1 KiB
Markdown
134 lines
4.1 KiB
Markdown
|
---
|
|||
|
title: Switch in Go
|
|||
|
localeTitle: Включить Go
|
|||
|
---
# Включить Go
|
|||
|
|
|||
|
Оператор переключения Go является альтернативой `if` . Он использует следующий синтаксис:
|
|||
|
|
|||
|
```go
|
|||
|
fruit := "apple"
|
|||
|
switch fruit {
|
|||
|
case "banana":
|
|||
|
fmt.Printf("Yellow and long.")
|
|||
|
case "apple":
|
|||
|
fmt.Printf("Red and round.")
|
|||
|
case "lemon":
|
|||
|
fmt.Printf("Yellow and round.")
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Выход этой программы будет `Red and round.` ,
|
|||
|
|
|||
|
Сначала мы объявляем переменную `fruit` как `apple` . Затем мы используем переменную `fruit` как выражение условия. Go сравнивает ценность `fruit` с такими `cases` как:
|
|||
|
|
|||
|
* плод == "банан" (ложный)
|
|||
|
* фрукты == "яблоко" (правда)
|
|||
|
|
|||
|
Уведомление о `lemon` не было проверено. После того, как оценка вернётся, больше не рассматриваются случаи.
|
|||
|
|
|||
|
Как и в `if` , вы можете объявлять временные переменные в выражении условия switch:
|
|||
|
|
|||
|
```go
|
|||
|
switch fruit := "apple"; fruit {
|
|||
|
case "banana":
|
|||
|
fmt.Printf("Yellow and long.")
|
|||
|
case "apple":
|
|||
|
fmt.Printf("Red and round.")
|
|||
|
case "lemon":
|
|||
|
fmt.Printf("Yellow and round.")
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Переменные `fruit` не будут доступны за пределами оператора switch.
|
|||
|
|
|||
|
## Стандартные и другие случаи
|
|||
|
|
|||
|
### По умолчанию
|
|||
|
|
|||
|
Ключевое слово по `default` - это случай падения, когда другие случаи не возвращают true:
|
|||
|
|
|||
|
```go
|
|||
|
switch fruit := "grape"; fruit {
|
|||
|
case "banana":
|
|||
|
fmt.Printf("Yellow and long.")
|
|||
|
case "apple":
|
|||
|
fmt.Printf("Red and round.")
|
|||
|
case "lemon":
|
|||
|
fmt.Printf("Yellow and round.")
|
|||
|
default:
|
|||
|
fmt.Printf("New fruit: %s!", fruit)
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Результатом этой программы будет `New fruit: grape!` ,
|
|||
|
|
|||
|
### То же действие для разных значений
|
|||
|
|
|||
|
Список значений, разделенных запятыми, для сравнения значения выражения условия с тем же действием.
|
|||
|
|
|||
|
```go
|
|||
|
switch fruit := "lemon"; fruit {
|
|||
|
case "banana", "lemon":
|
|||
|
fmt.Printf("Yellow fruit.")
|
|||
|
default:
|
|||
|
fmt.Printf("This fruit is a color different than yellow.")
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Выход: `Yellow fruit.` ,
|
|||
|
|
|||
|
### Без выражения
|
|||
|
|
|||
|
Переключатель без выражения означает, что значение `switch true` . Это альтернативная версия в цепочке else-if.
|
|||
|
|
|||
|
```go
|
|||
|
fruit := "banana"
|
|||
|
switch {
|
|||
|
case fruit == "banana":
|
|||
|
fmt.Printf("Yellow and long.")
|
|||
|
default:
|
|||
|
fmt.Printf("This is not a banana.")
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Это оценивает значение `true == (fruit == "banana")` , упрощенное к `true == true` , которое возвращает true.
|
|||
|
|
|||
|
### Перерыв
|
|||
|
|
|||
|
Вы можете сломать код в инструкции switch, чтобы пропустить код.
|
|||
|
|
|||
|
```go
|
|||
|
appleColor := "green"
|
|||
|
switch fruit := "apple"; fruit {
|
|||
|
case "banana":
|
|||
|
fmt.Printf("Yellow and long.")
|
|||
|
case "apple":
|
|||
|
if appleColor == "green" {
|
|||
|
fmt.Printf("This apple is green!")
|
|||
|
break
|
|||
|
}
|
|||
|
fmt.Printf("This apple is tasty!")
|
|||
|
case "lemon":
|
|||
|
fmt.Printf("Yellow and round.")
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Выход: `This apple is green!` ,
|
|||
|
|
|||
|
### Провалиться
|
|||
|
|
|||
|
Переходите к следующему случаю, оценивает ли его условие значение true.
|
|||
|
|
|||
|
```go
|
|||
|
switch fruit := "banana"; fruit {
|
|||
|
case "banana":
|
|||
|
fmt.Printf("Yellow and long.")
|
|||
|
fallthrough
|
|||
|
case "apple":
|
|||
|
fmt.Printf("Red and round.")
|
|||
|
case "lemon":
|
|||
|
fmt.Printf("Yellow and round.")
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Выход: `Yellow and long.` И `Red and round.` ,
|