我开始使用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)),但我仍然对问题的答案感兴趣。
xyz
f(string(p))
7ajki6be1#
这是因为可分配性规则,在你的具体情况下,这是最后一条规则。V是类型参数,T不是命名类型,V的类型集中的每个类型的值都可赋给T。类型string是一个命名的类型,因此,即使T的类型集中的每个类型都可赋值给string,类型参数T本身也不可赋值给string。您可以将其与未命名类型进行比较。
string
T
func f([]string) {} func xyz[T []string](p T) { f(p) // no issue }
1条答案
按热度按时间7ajki6be1#
这是因为可分配性规则,在你的具体情况下,这是最后一条规则。
V是类型参数,T不是命名类型,V的类型集中的每个类型的值都可赋给T。
类型
string
是一个命名的类型,因此,即使T
的类型集中的每个类型都可赋值给string
,类型参数T
本身也不可赋值给string
。您可以将其与未命名类型进行比较。