Найти в Дзене

#15 Приведение типов в Go

Чтобы убедиться, что значение переменной соответствует определенному типу или интерфейсу перед выполнением операций над ним, используют механизм приведения этого типа. Основное приведение типов Приведение типов выполняется с использованием оператора точки. Полностью выражение выглядит так x.(T), где x — это значение, которое нужно привести, а T — тип, к которому хотим привести. Если приведение прошло успешно, результатом будет базовое значение типа T, и паника если приведение не удалось. В примере переменная a интерфейсного типа принимает значение 10. Затем мы утверждаем, что a имеет тип int с помощью выражения приведения типа a.(int), и присваиваем результат переменной n. Значение n теперь 10, и мы можем безопасно использовать его как число типа int. Дальше делаем тоже самое для типа string и получаем panic, так как приведение к строке не удалось. Идиома "comma ok" Для безопасного приведения типов используется выражение приведения типа в сочетании с синтаксисом "comma ok". Первым пар
Оглавление

Чтобы убедиться, что значение переменной соответствует определенному типу или интерфейсу перед выполнением операций над ним, используют механизм приведения этого типа.

Основное приведение типов

Приведение типов выполняется с использованием оператора точки. Полностью выражение выглядит так x.(T), где x — это значение, которое нужно привести, а T — тип, к которому хотим привести. Если приведение прошло успешно, результатом будет базовое значение типа T, и паника если приведение не удалось.

В примере переменная a интерфейсного типа принимает значение 10. Затем мы утверждаем, что a имеет тип int с помощью выражения приведения типа a.(int), и присваиваем результат переменной n. Значение n теперь 10, и мы можем безопасно использовать его как число типа int.

Дальше делаем тоже самое для типа string и получаем panic, так как приведение к строке не удалось.

Идиома "comma ok"

Для безопасного приведения типов используется выражение приведения типа в сочетании с синтаксисом "comma ok". Первым параметров возвращается значение, как в примере выше, а вторым параметров булево значение, указывающее на успешность приведения типа.

-2

Переменная a интерфейсного типа принимает числовое значение 10. Затем мы используем "comma ok"-идиому для утверждения, что a имеет тип string, и присваиваем результат двум новым переменным m и ok. Поскольку a НЕ является строкой, значение ok будет false, и мы выполняем блок if, который печатает значение "not a string".

Приведение типов в структурах

Приведение типов часто используется при работе со структурами. У нас есть структура Vehicle с двумя полями: Type и Speed.

-3

В примере сначала создается интерфейсная переменная v и устанавливается в экземпляр структуры Vehicle. Затем используется приведение типов для доступа к полям Type и Speed структуры Vehicle.

Приведение типов с интерфейсами

Еще один распространенный случай использования приведения типов — это работа с интерфейсами в Go. У нас есть интерфейс Movable с методом Move.

ссылка на Playground

-4

Сначала определяется интерфейс Movable и две структуры Car и Bicycle, реализующие интерфейс Movable. Создается интерфейсная переменная m, которой присваиваются экземпляры структур Car и Bicycle. Затем используется приведение типов для вызова метода Move на этих структурах.

Интерфейсы обеспечивают универсальный способ взаимодействия с разными типами, которые имеют общий набор методов. Поскольку обе структуры Car и Bicycle реализуют интерфейс Movable, мы можем вызвать метод Move напрямую через интерфейсную переменную m, не приводя ее к конкретному типу. Исправленный пример будет выглядеть так:

-5

Приведение типа интерфейса может понадобиться, когда за интерфейсом скрываются разные реализации, и надо выполнить операции, специфичные для конкретного типа.

Рассмотрим сценарий, где у нас есть интерфейс Vehicle и две его реализации — Car и Bicycle. В структуре Car имеется специфичный метод StartEngine, которого нет в Bicycle.

-6

ссылка на Playground

Функция startJourney принимает интерфейс Vehicle, вызывает общий метод Drive и пытается привести Vehicle к Car для вызова метода StartEngine.

В main мы видим, что при передаче Car в startJourney, вызывается и Drive, и StartEngine, а при передаче Bicycle — только Drive.

Извлечение значения из интерфейсного типа

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

ссылка на Playground

-7

В этом коде используется приведение типов для извлечения значения Dog из интерфейса Animal. Переменная ok устанавливается в true, если приведение типов успешно, и в false в противном случае.

Следует использовать приведение типа с осторожностью и всегда проверять результат утверждения, чтобы избежать паники во время выполнения.

type switch

type switch позволяет обработать несколько разных типов.

Представим, что у нас есть система обработки различных типов событий в приложении. Каждое событие имеет свою уникальную структуру данных и логику обработки.

ссылка на Playground

-8

1. Определены три типа событий: MouseClickEvent, KeyEvent и NetworkEvent. Каждый из них реализует интерфейс Event с методом Process.

2. В main создается срез events, содержащий различные события. Для каждого события использует type switch для определения конкретного типа события. В зависимости от типа выполняется соответствующая логика обработки.