Generics

9 вопросов

Generics (параметрический полиморфизм) добавлены в Go 1.18. Квадратные скобки для параметров типа, constraints (any, comparable), type sets для ограничения типов.

1 С какой версии Go поддерживает generics? 🟢 Лёгкий
Ответ: B) 1.18

Generics (параметрический полиморфизм) добавлены в Go 1.18 (март 2022). Это было одно из самых ожидаемых изменений. Синтаксис: func F[T any](x T) T.

Подробнее →
2 Как объявить generic-функцию? 🟡 Средний
Ответ: B) func F[T any](x T)

Go использует квадратные скобки [] для параметров типа (не <> как в Java/C++). T any - параметр типа T с ограничением any (любой тип).

Подробнее →
3 Что такое type constraint в generics? 🟡 Средний
Ответ: B) Ограничение на допустимые типы параметра

Constraint - интерфейс, определяющий, какие типы допустимы. any - любой тип, comparable - типы с ==, constraints.Ordered - типы с <. Можно создавать свои.

Подробнее →
4 Что такое comparable constraint? 🟡 Средний
Ответ: B) Типы, поддерживающие == и !=

comparable - встроенный constraint для типов, которые можно сравнивать через == и !=. Это все базовые типы, массивы, структуры с сравнимыми полями. Слайсы, map, функции - не comparable.

Подробнее →
5 Что означает ~int в определении type constraint? 🟡 Средний
Ответ: B) Любой тип с underlying type int

Тильда ~ в type constraint означает "любой тип, чей underlying type совпадает". ~int включает int, а также type MyInt int, type Age int и т.д. Без тильды - только точный тип. Это позволяет generic-функциям работать с пользовательскими типами на основе int.

Подробнее →
6 Можно ли объявить generic-метод (с собственным type parameter) у обычного типа в Go? 🟡 Средний
Ответ: B) Нет, методы не могут иметь свои type parameters; generic-методы возможны только через generic-тип

В Go методы не могут иметь дополнительных type parameters. Generic-логику в методах можно реализовать только если сам тип параметризован.

Подробнее →
7 Скомпилируется ли: type MyInt int; func Sum[T int | float64](a, b T) T { return a + b }; Sum[MyInt](1, 2)? 🟡 Средний
Ответ: B) Нет, MyInt не входит в constraint int | float64; нужен ~int | ~float64 для включения производных типов

Constraint int | float64 принимает только точные типы. type MyInt int - отдельный тип. Для производных типов нужна тильда: ~int | ~float64.

Подробнее →
8 Можно ли вызвать метод .String() у параметра типа с constraint int | string? 🔴 Сложный
Ответ: B) Нет, доступны только общие методы для всех типов в union

Для параметра типа с union constraint доступны только методы, которые реализуют все типы в union. int не имеет метода String(), поэтому вызвать его нельзя. Union ограничивает множество операций до пересечения возможностей всех типов.

Подробнее →
9 Почему type switch switch v.(type) { case T: } не работает с type parameter T? 🔴 Сложный
Ответ: A) Это ограничение текущей реализации generics; для рантайм-проверки типа используйте any и обычный type switch

Go не поддерживает case T для type parameter в type switch. Для рантайм-проверки преобразуйте к any и используйте обычный type switch с конкретными типами.

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.