Ответ вслух Middle Дженерики обновлено

Дженерики в Go на собеседовании

Вопрос

Расскажите про дженерики в Go: синтаксис, ограничения, примеры, когда вы их используете и какие у них ограничения.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Дженерики есть с Go 1.18. Функция или тип объявляет параметры типов в квадратных скобках, например func FilterT any bool) []T.

Что должно прозвучать в ответе

  • Параметры типов у функций и типов в квадратных скобках, вывод типов из аргументов

  • Ограничения это интерфейсы: методы и наборы типов, тильда

  • 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 ошибок.