Go语言 是否将具有确切约束的类型形参传递给具有该实参的函数?

omvjsjqw  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(88)

我开始使用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)),但我仍然对问题的答案感兴趣。

7ajki6be

7ajki6be1#

这是因为可分配性规则,在你的具体情况下,这是最后一条规则。
V是类型参数,T不是命名类型,V的类型集中的每个类型的值都可赋给T。
类型string是一个命名的类型,因此,即使T的类型集中的每个类型都可赋值给string,类型参数T本身也不可赋值给string
您可以将其与未命名类型进行比较。

func f([]string) {}

func xyz[T []string](p T) {
    f(p) // no issue
}

相关问题