Пользовательские типы и экземпляры типов
Пользовательские типы
Определение типа или объявление определения типа, первоначально называвшееся объявлением типа, было единственным способом объявления типа до Go 1.9. Начиная с Go 1.9, определение типа стало одной из двух форм объявлений типа. Новая форма называется объявлением алиаса типа, который будет представлен ниже.
В Go мы можем определить новые типы, используя следующую форму. В синтаксисе type это ключевое слово type.
Объявление второго типа в приведенном выше примере включает две спецификации типа. Если объявление типа содержит более одной спецификации типа, спецификации типа должны быть заключены в пару ().
Примечание:
-
Новый определенный тип и соответствующий ему исходный тип в определениях типов — это два разных типа.
-
Два типа, определенные в двух определениях типов, всегда являются двумя разными типами.
-
Новый определенный тип и исходный тип будут использовать один и тот же базовый тип, и их значения могут быть преобразованы друг в друга.
-
Типы могут быть определены в телах функций.
На скриншоте показаны некоторые примеры определения типа.
Обрати внимание, что от Go 1.9 до Go 1.17 спецификация Go когда-либо считала предварительно объявленные встроенные типы определенными типами. Но начиная с Go 1.18, спецификация Go уточняет, что предварительно объявленные встроенные типы не являются определенными типами.
Пользовательские универсальные типы и экземпляры типов
Начиная с Go 1.18, Go поддерживает настраиваемые универсальные типы и функции. Универсальный тип должен быть создан для использования в качестве типов значений.
Универсальный тип — это определенный тип, а созданные им типы — это именованные типы.
Двумя другими важными понятиями в пользовательских универсальных шаблонах являются ограничения и параметры типа.
Именованные типы и безымянные типы
До версии Go 1.9 терминология именованного типа точно определялась в спецификации Go. Именованный тип был определен как тип, представленный идентификатором. Наряду с функцией псевдонима пользовательского типа, представленной в Go 1.9, терминология именованного типа была удалена из спецификации Go и заменена терминологией определенного типа. Начиная с Go 1.18, наряду с введением пользовательских дженериков, терминология именованного типа была снова добавлена в спецификацию Go.
Именованным типом может быть:
-
предварительно объявленный тип;
-
определенный (нестандартный универсальный) тип;
-
инстанцированный тип (универсального типа);
-
тип параметра типа (используется в пользовательских универсальных шаблонах).
Другие типы значений называются безымянными типами. Безымянный тип должен быть составным типом, а не наоборот.