9 вопросов
Generics (параметрический полиморфизм) добавлены в Go 1.18. Квадратные скобки для параметров типа, constraints (any, comparable), type sets для ограничения типов.
Generics (параметрический полиморфизм) добавлены в Go 1.18 (март 2022). Это было одно из самых ожидаемых изменений. Синтаксис: func F[T any](x T) T.
Подробнее →Go использует квадратные скобки [] для параметров типа (не <> как в Java/C++). T any - параметр типа T с ограничением any (любой тип).
Подробнее →Constraint - интерфейс, определяющий, какие типы допустимы. any - любой тип, comparable - типы с ==, constraints.Ordered - типы с <. Можно создавать свои.
Подробнее →comparable constraint? 🟡 Средний
▶
comparable - встроенный constraint для типов, которые можно сравнивать через == и !=. Это все базовые типы, массивы, структуры с сравнимыми полями. Слайсы, map, функции - не comparable.
Подробнее →~int в определении type constraint? 🟡 Средний
▶
Тильда ~ в type constraint означает "любой тип, чей underlying type совпадает". ~int включает int, а также type MyInt int, type Age int и т.д. Без тильды - только точный тип. Это позволяет generic-функциям работать с пользовательскими типами на основе int.
Подробнее →В Go методы не могут иметь дополнительных type parameters. Generic-логику в методах можно реализовать только если сам тип параметризован.
Подробнее →type MyInt int; func Sum[T int | float64](a, b T) T { return a + b }; Sum[MyInt](1, 2)? 🟡 Средний
▶
Constraint int | float64 принимает только точные типы. type MyInt int - отдельный тип. Для производных типов нужна тильда: ~int | ~float64.
Подробнее →.String() у параметра типа с constraint int | string? 🔴 Сложный
▶
Для параметра типа с union constraint доступны только методы, которые реализуют все типы в union. int не имеет метода String(), поэтому вызвать его нельзя. Union ограничивает множество операций до пересечения возможностей всех типов.
Подробнее →switch v.(type) { case T: } не работает с type parameter T? 🔴 Сложный
▶
Go не поддерживает case T для type parameter в type switch. Для рантайм-проверки преобразуйте к any и используйте обычный type switch с конкретными типами.
Подробнее →