Утверждение типа
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 17 из 68.
При работе с интерфейсными переменными вам часто требуется доступ к фактическому конкретному значению, хранящемуся внутри них. Здесь на помощь приходят утверждения типов (type assertions) — они позволяют безопасно извлекать и использовать лежащее в основе значение.
Утверждение типа использует следующий синтаксис: value, ok := interfaceVariable.(Type). Первое возвращаемое значение — это извлеченное значение указанного типа, а второе — логическое значение (boolean), которое сообщает, было ли утверждение успешным.
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{}, позволяя вам преобразовать общий интерфейс обратно в конкретный тип, чтобы вы могли использовать его методы и операции.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоВ этом испытании вы попрактикуетесь в использовании утверждений типов (type assertions) для безопасного извлечения и работы с конкретными значениями из переменных интерфейса. Вы создадите анализатор данных, который обрабатывает различные типы значений, хранящихся в пустых интерфейсах.
Вы получите два входных значения:
- Строка, представляющая тип данных для проверки (например,
"int","string"или"bool") - Строка, представляющая фактическое значение (например,
"42","hello"или"true")
Ваша задача:
- Преобразовать строку значения в соответствующий тип Go и сохранить ее в переменной
interface{}:- Для
"int": преобразовать в целое число - Для
"string": использовать как строку - Для
"bool": преобразовать в логическое значение
- Для
- Использовать утверждение типа (type assertion), чтобы проверить, содержит ли переменная интерфейса ожидаемый тип, указанный в первом входном значении
- Если утверждение типа прошло успешно, вывести:
"Success: [value] is a [type]" - Если утверждение типа не удалось, вывести:
"Failed: value is not a [type]"
Вы должны использовать безопасный синтаксис утверждения типа с переменной ok, чтобы проверить, было ли утверждение успешным. Это испытание проверяет ваше понимание того, как безопасно извлекать конкретные значения из переменных интерфейса, не вызывая паники программы.
Для логического преобразования "true" должно преобразовываться в true, а любая другая строка — в false. Используйте пакет strconv для преобразования строки в целое число.
Шпаргалка
Утверждения типа позволяют извлекать конкретные значения из переменных интерфейса, используя синтаксис 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 указывает, было ли утверждение успешным. Если значение равно false, value будет содержать нулевое значение этого типа. Всегда проверяйте ok, чтобы предотвратить панику из-за неудачных утверждений.
Попробуйте сами
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. Используйте утверждение типа (type assertion), чтобы проверить, содержит ли interfaceValue ожидаемый тип
// 3. Выведите соответствующее сообщение об успехе или ошибке
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение