Выбор ответа Junior Дженерики спрашивают часто обновлено

Ограничение comparable

Вопрос

Почему функция func Index[T any](s []T, v T) int с if x == v внутри не компилируется?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: any не гарантирует ==, нужно ограничение comparable. Компилятор проверяет тело дженерика по ограничению, а не по конкретным типам.

Варианты ответа

  1. В дженериках нельзя использовать операторы вообще
  2. any не гарантирует ==, нужно ограничение comparableправильный ответ
  3. Для == нужно ограничение cmp.Ordered, не comparable
  4. Нужно привести x и v к any перед сравнением

Разбор

Компилятор проверяет тело дженерика по ограничению, а не по конкретным типам. В any входят слайсы и мапы, которые несравнимы, поэтому == запрещён. comparable разрешает == и !=. cmp.Ordered тоже подошёл бы, но он слишком строгий: добавляет < и исключает структуры. Операторы в дженериках можно использовать, если их разрешает ограничение. Приведение к any сравнит интерфейсы и может запаниковать.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.