Дженерики в Go на собеседовании
Вопрос
Расскажите про дженерики в Go: синтаксис, ограничения, примеры, когда вы их используете и какие у них ограничения.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Параметры типов у функций и типов в квадратных скобках, вывод типов из аргументов
Ограничения это интерфейсы: методы и наборы типов, тильда
any, comparable, cmp.Ordered
Пример: обобщённые Map/Filter, кеш, пакеты slices и maps
Нет параметров типов у методов, нет специализаций
Реализация через GC shape stenciling и словари
Что могут спросить следом
- Можно ли сделать type switch по параметру типа?
- Чем дженерик быстрее функции с interface{}?
Разбор
Дженерики есть с Go 1.18. Функция или тип объявляет параметры типов в квадратных скобках, например func Filter[T any](s []T, keep func(T) bool) []T. Обычно типы выводятся из аргументов. Каждый параметр имеет ограничение, и это интерфейс: в нём могут быть методы и набор типов, например ~int | ~float64, где тильда разрешает типы с таким базовым. Встроенные ограничения: any, comparable для ключей мап и ==, cmp.Ordered для <. Использую для утилит над коллекциями, типизированного кеша Cache[K comparable, V any], пулов и очередей. Многое уже есть в slices и maps. Ограничения: у методов нет своих параметров типов, нет специализации, type switch прямо по T нельзя, только по any(v). Под капотом Go генерирует одну копию кода на форму типов и передаёт словарь, так что дженерик обычно быстрее interface{} с приведением, но может уступать коду под конкретный тип.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.