Menu
Coddy logo textTech

Переключатель типов

Часть раздела Логика и управление потоком путешествия по 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, особенно когда нужно обработать несколько разных типов в одном месте.

challenge icon

Задание

Легко

В этом задании вы попрактикуетесь в использовании переключателей типов для обработки нескольких типов данных в системе уведомлений. Вы создадите функцию, которая обрабатывает разные типы уведомлений и форматирует их соответствующим образом на основе их конкретного типа.

Вы получите два входных значения:

  • Строку, представляющую тип уведомления (например, "email", "sms", "push" или "alert")
  • Строку, представляющую содержимое или значение уведомления

Ваша задача:

  1. Создать функцию с именем processNotification, которая принимает параметр типа interface{}
  2. На основе входного типа уведомления преобразовать содержимое в соответствующий тип Go и сохранить его в переменной типа interface{}:
    • Для "email": использовать содержимое как строку
    • Для "sms": преобразовать содержимое в целое число (представляющее количество символов)
    • Для "push": преобразовать содержимое в логическое значение (true для "enabled", false для любого другого значения)
    • Для "alert": преобразовать содержимое в float64 (представляющее уровень приоритета)
  3. Вызвать функцию processNotification с преобразованным значением
  4. Внутри 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(&notificationType)
	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
	
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go