Пустой интерфейс
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 16 из 68.
До сих пор ты работал с интерфейсами, которые требуют определённых методов, но в Go есть специальный интерфейс, который невероятно гибок: пустой интерфейс, записываемый как interface{}.
Пустой интерфейс вообще не предъявляет требований к методам, а это означает, что любой тип в Go автоматически ему соответствует. Поскольку каждый тип реализует ноль методов (как минимум), любой тип можно присвоить переменной типа interface{}:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceЭто делает interface{} чрезвычайно полезным, когда вам нужно работать с данными неизвестного типа или с данными, тип которых может различаться. Вы можете столкнуться с этим при чтении файлов конфигурации, обработке пользовательского input или работе с API, которые возвращают разные типы данных в зависимости от ситуации.
Однако, поскольку пустой интерфейс может содержать любой тип, вам часто потребуется определить, какой тип фактически хранится внутри него, прежде чем вы сможете осмысленно использовать это значение. Именно здесь утверждения типов и переключатели типов (о которых вы узнаете далее) становятся незаменимыми инструментами для безопасной работы со значениями interface{}.
Задание
ЛегкоВ этом задании вы попрактикуетесь в работе с пустым интерфейсом, создав процессор data, который может обрабатывать значения разных типов. Вы создадите function, которая принимает параметр interface{} и обрабатывает различные типы data.
Вы получите два входных значения:
- Строку, представляющую тип data (например,
"int","string","bool"или"slice") - Строку, представляющую фактическое значение (например,
"42","hello","true"или"1,2,3")
Ваша задача:
- Создать function с именем
processData, которая принимает параметрinterface{}и выводит информацию о значении - На основе входного типа data преобразовать строку значения в соответствующий тип Go:
- Для
"int": преобразовать в целое число - Для
"string": использовать как строку - Для
"bool": преобразовать в логическое значение - Для
"slice": преобразовать значения, разделённые запятыми, в slice целых чисел
- Для
- Вызвать function
processDataс преобразованным значением - Внутри
processDataвывести значение и его тип в формате:"Value: [value], Type: [type]"
Для входного значения slice строка со значениями, разделёнными запятыми, например "1,2,3", должна быть преобразована в []int{1, 2, 3}. Function должна работать с любым типом, поскольку принимает interface{}, демонстрируя, как пустой интерфейс может содержать значения любого типа. Используйте fmt.Printf с форматными глаголами %v и %T, чтобы вывести соответственно значение и тип.
Попробуйте сами
package main
import (
"fmt"
)
func main() {
// Считать ввод
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// TODO: Напишите ваш код ниже
// 1. Создайте функцию processData, которая принимает interface{}
// 2. Преобразуйте valueStr в соответствующий тип на основе dataType
// 3. Вызовите processData с преобразованным значением
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go