# switch

Существуют две разновидности инструкции выбора `switch`: выбор по значению выражения и выбор по типу. Инструкция `switch` в Go не выполняет все ветки до первой инструкции `break` (как в других языках; то есть в Go не требуется завершать инструкцией `break` каждый раздел `case`). Однако имеется возможность явно потребовать "проваливаться" в следующий раздел `case` с помощью инструкции `fallthrough`.

## Выбор по значению выражения

```go
switch необязательнаяИнструкция; необязательноеВыражение {  // по умолчанию необязательноеВыражение = true
    case списокВыражений1: блок1  // списокВыражений разделяется запятыми
    ...
    case списокВыраженийN: блокN // тип списокВыражений должен совпадать с необязательноеВыражение 
    default: блокD
}
```

## Выбор по типу

```go
switch необязательнаяИнструкция; переключательТипа {
    case списокТипов1: блок1
    ...
    case списокТиповN: блокN
    default: блокD
}
```

Служит для приведения типов чаще.

## switch true

Это аналог (лучший) написанию длинных цепочек if-then-else:

```go
t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("Good morning!")
	case t.Hour() < 17:
		fmt.Println("Good afternoon.")
	default:
		fmt.Println("Good evening.")
	}
```
