Практика: 7 коротких упражнений, чтобы switch реально запомнился
Ниже не просто список задач, а маленький тренажёр. У каждой задачи есть цель, шаблон и короткая проверка себя. Делайте по порядку: так тема закрепляется намного лучше.
Не копируйте код, старайтесь прописывать всё вручную, пока учитесь. Так разберётесь в теме намного глубже.
Упражнение 1. День недели
Что тренируем: обычный switch и несколько значений в одном case.
Задача:По строке day выведите:
- Рабочий день
- Выходной
- Неизвестный день
Шаблон: package main
import "fmt"
func main() {
day := "saturday"
switch day {
// ваш код
}
}
Проверьте себя:
- при "monday" должно выводиться Рабочий день
- при "sunday" должно выводиться Выходной
- при "holiday" должно выводиться Неизвестный день
Что важно понять: одинаковую логику не надо дублировать в нескольких case, значения можно объединять через запятую.
Упражнение 2. Оценка по баллам
Что тренируем: switch без выражения.
Задача:
По числу score выведите:
- Отлично
- Хорошо
- Нормально
- Слабо
Шаблон:
package main
import "fmt"
func main() {
score := 82
// ваш код
}
Проверьте себя:
- 95 -> Отлично
- 82 -> Хорошо
- 61 -> Нормально
- 40 -> Слабо
Типичная ошибка: ставить сначала score >= 60, а потом score >= 90. Тогда более точные условия уже не сработают.
Упражнение 3. HTTP-статус
Что тренируем: обычный switch и default.
Задача:
Сделайте switch по коду ответа:
- 200 -> OK
- 400 -> Bad Request
- 404 -> Not Found
- всё остальное -> Unknown status
Шаблон:
package main
import "fmt"
func main() {
status := 404
switch status {
case 200:
// ваш код
case 400:
// ваш код
case 404:
// ваш код
default:
// ваш код
}
}
Зачем это полезно: это уже похоже на реальный код, где нужно обрабатывать фиксированный набор значений.
Упражнение 4. Несколько ролей
Что тренируем: grouping в case и читаемую бизнес-логику.
Задача:
Есть строка role. Для admin и owner выведите Полный доступ, для editor — Можно редактировать, для остальных — Ограниченный доступ.
Шаблон:
package main
import "fmt"
func main() {
role := "editor"
switch role {
case "admin", "owner":
// ваш код
case "editor":
// ваш код
default:
// ваш код
}
}
Вывод: именно в таких местах switch часто читается лучше, чем длинный if else if.
Упражнение 5. fallthrough
Что тренируем: понимание самой коварной части темы.
Задача: Сделайте пример, где при значении 2 выполнится и ветка 2, и следующая ветка.
Шаблон:
package main
import "fmt"
func main() {
x := 2
switch x {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
// добавьте fallthrough
case 3:
fmt.Println("three")
}
}
Что должно получиться:
two
three
Главная мысль: fallthrough не проверяет следующий case. Он просто заставляет выполнить следующий блок.
Упражнение 6. type switch
Что тренируем: различие между значением и типом.
Задача: Сделайте функцию, которая принимает interface{} и:
- для int печатает число, умноженное на 2;
- для string печатает длину строки;
- для bool печатает булево значение;
- для остальных типов печатает неизвестный тип.
Шаблон:
package main
import "fmt"
func describe(v interface{}) {
switch val := v.(type) {
case int:
// ваш код
case string:
// ваш код
case bool:
// ваш код
default:
// ваш код
}
}
func main() {
describe(21)
describe("go")
describe(true)
describe(3.14)
}
Проверьте себя:
- 21 -> 42
- "go" -> 2
- true -> булево значение
- 3.14 -> неизвестный тип
Что важно понять: обычный switch сравнивает значения, а type switch сравнивает типы.
Упражнение 7. Перепишите if else в switch
Что тренируем: чувство уместности.
Задача: Возьмите такой код:
if score >= 90 {
fmt.Println("Отлично")
} else if score >= 75 {
fmt.Println("Хорошо")
} else if score >= 60 {
fmt.Println("Нормально")
} else {
fmt.Println("Слабо")
}
Перепишите его через switch без выражения.
Зачем это делать: это лучший способ почувствовать, где switch реально делает код чище, а где if и так был нормальным.