🔴 Сложный · 3 очк. Generics
Почему type switch switch v.(type) { case T: } не работает с type parameter T?
A Это ограничение текущей реализации generics; для рантайм-проверки типа используйте any и обычный type switch
B Работает начиная с Go 1.21
C Работает, но только с comparable constraint
D Type switch вообще не поддерживается в Go
Объяснение вопроса

Go не позволяет использовать type parameter в case конструкции type switch:

func Process[T any](v T) {
    // Не скомпилируется:
    // switch v.(type) {
    // case T: // ошибка: нельзя использовать type parameter
    // }

    // Workaround: приведение к any
    switch any(v).(type) {
    case int:
        fmt.Println("int")
    case string:
        fmt.Println("string")
    default:
        fmt.Println("other")
    }
}

Ограничение осознанное: type parameter известен при инстанциации (компиляции), а type switch работает в рантайме. Смешивание этих механизмов усложнило бы систему типов.

Если нужна разная логика для разных типов, часто лучше использовать интерфейсы с методами вместо generics.

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