Я начинаю использовать дженерики Go и с трудом понимаю, почему этот код не компилируется:
func f(string) {}
func xyz[T string](p T) {
f(p) // Error! Cannot use 'p' (type T) as the type string
}
Почему в функции xyz нельзя предположить, что существует ограничение типа для T, такое что T является строковым типом?
Я понимаю, что мог бы просто написать f(string(p)), но меня все равно интересует ответ на вопрос.

Это из-за правил присваиваемости, в вашем конкретном случае это последнее правило.
V является параметром типа, а T не является именованным типом, и значения каждого типа в наборе типов V могут быть присвоены T.
Тип string является именованным типом, и поэтому, хотя каждый тип в наборе типов T может быть назначен string, сам параметр типа T не может быть назначен string.
Вы можете сравнить это с безымянным типом.
func f([]string) {}
func xyz[T []string](p T) {
f(p) // no issue
}
Вы также можете изменить объявление
fнаfunc f[T string](T) {}. Ограничение типа с одним типом X просто не совпадает с одним типомX.