Утверждения типов
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 17 из 68.
При работе с переменными интерфейсного типа часто требуется получить фактическое конкретное значение, хранящееся в них. Здесь пригодятся утверждения типа — они позволяют безопасно извлечь и использовать базовое значение.
Утверждение типа использует такой синтаксис: value, ok := interfaceVariable.(Type). Первое возвращаемое значение — это извлечённое значение указанного типа, а второе — логическое значение, которое показывает, успешно ли прошло утверждение.
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}Переменная ok крайне важна для безопасности. Если попытаться выполнить приведение к неправильному типу, ok будет равна false, а value будет нулевым значением этого типа. Если не проверить ok, неудачное приведение типа вызовет панику в программе.
Утверждения типов необходимы при работе со значениями interface{}: они позволяют преобразовать обобщённый интерфейс обратно в конкретный тип, чтобы использовать его методы и операции.
Задание
ЛегкоВ этом задании ты потренируешься использовать утверждения типов для безопасного извлечения конкретных значений из переменных интерфейсного типа и работы с ними. Ты создашь анализатор данных, который обрабатывает значения разных типов, хранящиеся в пустых интерфейсах.
Тебе будут переданы два входных значения:
- Строка, представляющая тип данных, который нужно проверить (например,
"int","string"или"bool") - Строка, представляющая фактическое значение (например,
"42","hello"или"true")
Твоя задача:
- Преобразовать строковое значение в соответствующий тип Go и сохранить его в переменной типа
interface{}:- Для
"int": преобразовать в целое число - Для
"string": использовать как строку - Для
"bool": преобразовать в логическое значение
- Для
- Использовать утверждение типа, чтобы проверить, содержит ли переменная интерфейсного типа ожидаемый тип, указанный во входных данных
- Если утверждение типа успешно, вывести:
"Success: [value] is a [type]" - Если утверждение типа не удалось, вывести:
"Failed: value is not a [type]"
Для проверки успешности утверждения используй безопасный синтаксис утверждения типа с переменной ok. Это задание проверяет, понимаешь ли ты, как безопасно извлекать конкретные значения из переменных интерфейсного типа, не вызывая панику программы.
При преобразовании в логическое значение строка "true" должна преобразовываться в true, а любая другая строка — в false. Для преобразования строки в целое число используй пакет strconv.
Попробуйте сами
package main
import (
"fmt"
"strconv"
)
func main() {
// Считайте входные данные
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// Переменная для хранения значения интерфейсного типа
var interfaceValue interface{}
// TODO: Напишите свой код ниже
// 1. Преобразуйте valueStr в нужный тип в зависимости от dataType и сохраните результат в interfaceValue
// 2. Используйте утверждение типа, чтобы проверить, содержит ли interfaceValue значение ожидаемого типа
// 3. Выведите соответствующее сообщение об успехе или ошибке
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go