Go 泛型中调用联合约束的方法
在 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() } // Compiler error
编译器错误“x.some undefined”是由于类型联合约束 *A | *B 不保证 *A 和 *B 上都存在某个方法。
要解决此问题,可以将该方法添加到接口约束中:
type AB interface { *A | *B; some() bool } func some[T AB](x T) bool { return x.some() } // Works
这将 T 限制为同时实现 *A 或 *B 并声明 some 方法的类型。
但是,此解决方案被视为一种解决方法,可以理想地单独使用类型联合。 Go 1.18 目前存在一些限制,即仅当方法 m 由 P 的约束接口显式声明时,编译器才支持对类型参数 P 的值调用方法。尽管语言规范规定接口的方法集是接口的类型集中每种类型的方法集的交集。该问题预计将在 Go 1.19 中得到解决。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3