Переключатель типов
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 18 из 68.
Хотя утверждения типов хорошо подходят для проверки одного типа, часто приходится обрабатывать несколько возможных типов переменной интерфейсного типа. Здесь очень полезен переключатель типов: он позволяет легко выполнять разные действия в зависимости от конкретного типа.
В переключателе типов используется такой специальный синтаксис: switch v := i.(type). Обрати внимание на ключевое слово (type) вместо конкретного типа. Переменная v будет содержать фактическое значение с его конкретным типом в каждом варианте:
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}В каждом случае v автоматически имеет правильный тип — дополнительные утверждения типа не нужны. Благодаря этому переключатели типов намного чище, чем цепочки из нескольких утверждений типа с операторами if-else, особенно если нужно обработать несколько разных типов в одном месте.
Задание
ЛегкоВ этом задании ты потренируешься использовать переключатели типов для обработки нескольких типов данных в системе уведомлений. Ты создашь функцию, которая обрабатывает уведомления разных типов и форматирует их соответствующим образом в зависимости от их конкретного типа.
Ты получишь два входных значения:
- Строку, представляющую тип уведомления (например,
"email","sms","push"или"alert") - Строку, представляющую содержимое или значение уведомления
Твоя задача:
- Создать функцию с именем
processNotification, принимающую параметр типаinterface{} - В зависимости от входного значения типа уведомления преобразовать содержимое в соответствующий тип Go и сохранить его в переменной типа
interface{}:- Для
"email": использовать содержимое как строку - Для
"sms": преобразовать содержимое в целое число (представляющее количество символов) - Для
"push": преобразовать содержимое в логическое значение (true для "enabled", false для любого другого значения) - Для
"alert": преобразовать содержимое в float64 (представляющее уровень приоритета)
- Для
- Вызвать функцию
processNotificationс преобразованным значением - Внутри
processNotificationиспользовать переключатель типов для обработки каждого типа и вывода соответствующего сообщения:- Для
string:"Email notification: [value]" - Для
int:"SMS notification with [value] characters" - Для
bool:"Push notifications: [value]" - Для
float64:"Alert with priority: [value]" - Для любого другого типа:
"Unknown notification type"
- Для
Используй пакет strconv для преобразования строк. При преобразовании в логическое значение только "enabled" должно давать результат true. Это задание показывает, как переключатели типов позволяют удобно обрабатывать несколько типов в одной управляющей конструкции, автоматически предоставляя значение правильного типа в каждом случае.
Выводи float64 в кратчайшем формате, как это делают fmt.Println или спецификаторы %v / %g: 3.5 выводится как 3.5, а 1.0 — как 1 (спецификатор %f вывел бы 1.000000).
Попробуйте сами
package main
import (
"fmt"
"strconv"
)
func main() {
// Считайте входные данные
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: Напишите свой код ниже
// 1. Создайте функцию processNotification, принимающую параметр типа interface{}
// 2. Преобразуйте content в подходящий тип на основе notificationType
// 3. Вызовите processNotification с преобразованным значением
// 4. Используйте переключатель типов внутри processNotification для обработки разных типов
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go