Go 泛型中的联合约束:未解决的限制
在 Go 泛型领域,类型联合约束引发了一些混乱。当尝试对联合约束内的类型使用通用方法时,编译器会抛出错误,让开发人员摸不着头脑。
考虑以下代码:
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() } // Compilation error
编译器抱怨说x.some 未定义,即使 *A 和 *B 都实现了 some 方法。这就引出了一个问题:如果无法使用共享方法,为什么还要定义联合约束?
Go 跟踪器建议的解决方法是将方法添加到接口约束中:
type AB interface { *A | *B ; some() bool } func some[T AB](x T) bool { return x.some() } // Compiles
然而,这是一个不完美的解决方案。 Go 的类型联合约束应该允许共享方法,而不需要显式的接口声明。不幸的是,这是 Go 1.18 的限制,记录在发行说明中:
Go 编译器当前仅支持在类型参数类型 P 的值 x 上调用方法 m(如果 m 由 P 的约束接口显式声明) .
此限制预计将在 Go 1.19 中得到解决。在那之前,开发人员必须依赖解决方法或为共享方法定义统一的接口。
以上是为什么我不能使用具有 Go 泛型联合约束的共享方法?的详细内容。更多信息请关注PHP中文网其他相关文章!