Переключатель типов
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 18 из 68.
Хотя утверждения типов хорошо подходят для проверки одного типа, часто необходимо обрабатывать несколько возможных типов переменной interface. Здесь переключатель типов становится невероятно полезным — он предоставляет удобный способ выполнять разные действия в зависимости от конкретного типа.
Переключатель типов использует специальный синтаксис: 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. Create processNotification function that takes interface{} parameter
// 2. Convert content to appropriate type based on notificationType
// 3. Call processNotification with the converted value
// 4. Use type switch inside processNotification to handle different types
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go