Menu
CoddyTech

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

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

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. Создайте функцию processNotification, принимающую параметр типа interface{}
	// 2. Преобразуйте content в подходящий тип на основе notificationType
	// 3. Вызовите processNotification с преобразованным значением
	// 4. Используйте переключатель типов внутри processNotification для обработки разных типов
	
}
quiz iconПроверьте себя

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

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

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