История вопроса:
Появление псевдонимов типов (type alias) в Go связано с необходимостью обеспечить более плавный переход между версиями API, когда тип переходит из одного пакета в другой. До Go 1.9 использовалось только объявление новых типов, теперь же поддерживаются type alias.
Проблема:
Многие путают alias и новый тип — ошибочно считают их идентичными, что приводит к ошибкам при конвертации, методах, передаче в интерфейсы.
Решение:
Type alias создает альтернативное имя существующему типу, тогда как объявление нового типа — это создание нового уникального типа на базе существующего. Алиасы позволяют сохранить обратную совместимость и интегрировать старые и новые типы без конвертации.
Пример кода:
// Новый тип type MyString string // Алиас типа type MyStringAlias = string
Ключевые особенности:
Можно ли добавить методы типу через alias?
Нет, методы можно добавлять только к новым типам, а псевдоним – это не новый тип, а то же самое, что исходный Type.
type Alias = int // func (a Alias) Method() {} // ошибка!
В чем разница в сравнении типов alias и нового типа?
Alias сравним с базовым типом и принимает его значение без конверсии. Новый тип не совместим даже если базируется на том же типе.
type T1 = int var a T1 = 10 // ok var b int = a // ok type T2 int var c T2 = 10 // var d int = c // ошибка компиляции
Когда alias лучше, чем новый тип?
Когда требуется переэкспорт типа между пакетами или обеспечить прозрачную миграцию API без перекомпиляции кода клиентов. Например:
type OldType = NewType // alias удобнее для поддержки старых версий API
В проекте переименовывают тип с помощью нового типа, а не alias, что ломает совместимость
type OldType int
Плюсы:
Минусы:
Используется type alias для прозрачной миграции API
type OldType = NewType
Плюсы:
Минусы: