我试图了解 Go 泛型(v1.18)中类型联合约束的用法。这是我尝试过的代码:
type A struct {
}
type B struct {
}
type AB interface {
*A | *B
}
func (a *A) some() bool {
return true
}
func (b *B) some() bool {
return false
}
func some[T AB](x T) bool {
return x.some() // <- error
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:
x.some未定义(类型T没有字段或方法)
这是为什么?*A如果我不能使用and类型的共享方法*B,那么定义类型 union 的意义何在*A | *B?
(显然我可以使用共享方法定义一个接口并直接使用它。但在我的特定用例中,我想明确限制为某些类型。)
bla*_*een 12
将方法添加到接口约束中,而不放弃泛型:
type AB interface {
*A | *B
some() bool
}
func some[T AB](x T) bool {
return x.some() // works
}
Run Code Online (Sandbox Code Playgroud)
这限制为or和声明方法T的类型。*A*Bsome() bool
然而,正如您已经发现的,这是一种解决方法。你是对的,它应该单独与类型联合一起使用。这是 Go 1.18 的限制。令人困惑的部分是语言规范似乎仍然支持您的理论(方法集):
接口类型的方法集是接口类型集中每个类型的方法集的交集(结果方法集通常只是接口中声明的方法集)。
此限制似乎仅记录在Go 1.18 发行说明中:
当前的泛型实现具有以下限制:
[...] Go 编译器当前仅支持在类型参数 type 的
m值上调用方法(如果由 的约束接口显式声明)。[...] 即使可能在方法集中,因为所有类型都实现了. 我们希望在 Go 1.19 中取消这个限制。xPmPmPPm
Go 跟踪器中的相关问题是#51183,Griesemer 已确认并决定保留语言规范不变,并记录限制。
| 归档时间: |
|
| 查看次数: |
14332 次 |
| 最近记录: |