С точки зрения стандарта языка:
Each type argument is substituted for its corresponding type parameter in the generic declaration. This substitution happens across the entire function or type declaration, including the type parameter list itself and any types in that list.
То есть, тип, объявленный внутри generic-функции insert[T], автоматически захватывает любой T, даже, если сам этот тип не использует T явно.
Таким образом, в
m будут ключи Data[string] и Data[int] и len(m) == 2.https://go.dev/play/p/Nl250o6wX2X
Но всё немного тоньше. Если написать сигнатуру
func insert[T comparable](m map[any]T, a T), то итоговый ответ будет 1, но почему?https://go.dev/play/p/EkkuBuwtQJ6
Потому что компилятор попытается вывести тип
T и ему подойдёт только any, следовательно, в m будет всегда один ключ Data[any].Two instantiated types are identical if they are instantiated from the same generic type and with the same full‑form type argument list.
В таких ситуациях нужно внимательно смотреть за выводом типов
🙄🙄 Ещё больше примеров на курсах