Сумма типов (или размеченное объединение, дизъюнктное объединение) — это тип данных, который может принимать значение одного из нескольких предопределенных вариантов. В отличие от произведения типов (структур), где значение содержит все поля одновременно, сумма типов содержит только одно из возможных значений.
В Go нет прямой поддержки сумм типов как в языках вроде Haskell или Rust (enum). Сумму типов можно эмулировать несколькими способами:
Интерфейсы и утверждение типа (Type Assertion):
Создать интерфейс, который будут реализовывать все возможные варианты. Значение типа суммы будет представлять собой этот интерфейс, а для определения конкретного варианта используется утверждение типа или type switch.
go
Структуры с булевыми флагами (редко используется):
Структура содержит поля для всех возможных вариантов и булевы флаги для указания, какой вариант активен. Небезопасно и сложно в поддержке.
go
Структуры с нулевым значением для неактивных полей (часто используется для Optional/Result):
Структура содержит поля для всех возможных вариантов, но только одно из них будет ненулевым. Работает хорошо для указателей или типов, имеющих четкое "нулевое" значение.
go
Наиболее идиоматичным и безопасным способом эмуляции сумм типов в Go является использование интерфейсов и type switch. Это позволяет гарантировать, что только один из вариантов присутствует, и обеспечивает типобезопасность при работе с ним.