Menu
CoddyTech

Утверждения типов

Часть раздела Логика и управление потоком путешествия по 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{}: они позволяют преобразовать обобщённый интерфейс обратно в конкретный тип, чтобы использовать его методы и операции.

challenge icon

Задание

Легко

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

Тебе будут переданы два входных значения:

  • Строка, представляющая тип данных, который нужно проверить (например, "int", "string" или "bool")
  • Строка, представляющая фактическое значение (например, "42", "hello" или "true")

Твоя задача:

  1. Преобразовать строковое значение в соответствующий тип Go и сохранить его в переменной типа interface{}:
    • Для "int": преобразовать в целое число
    • Для "string": использовать как строку
    • Для "bool": преобразовать в логическое значение
  2. Использовать утверждение типа, чтобы проверить, содержит ли переменная интерфейсного типа ожидаемый тип, указанный во входных данных
  3. Если утверждение типа успешно, вывести: "Success: [value] is a [type]"
  4. Если утверждение типа не удалось, вывести: "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. Выведите соответствующее сообщение об успехе или ошибке
	
}
quiz iconПроверьте себя

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

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

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