在 Go2 泛型中,您可以使用接口来约束泛型类型,确保它实现特定方法。然而,当前草案中不允许强制实现带有泛型类型参数的方法。
引入解决方案:
新草案允许定义 Lesser 接口和 IsLess函数为:
type Lesser[T any] interface { Less(T) bool } func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
此解决方案强制 T 必须是实现 Lesser 接口的类型,这需要一个 Less 方法采用T 类型的参数。通过定义约束 T Lesser[T],我们创建了一个递归类型约束。
实际示例:
type Apple int func (a Apple) Less(other Apple) bool { return a < other } type Orange int func (o Orange) Less(other Orange) bool { return o < other } func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Orange(30), Orange(15))) // false }
在此示例中,自定义类型 Apple 和 Orange两者都满足 Lesser 要求并且可以传递给 IsLess。但是,传递 int 或混合类型(例如 Apple 和 Orange)将因类型约束而导致编译错误。
结论:
此解决方案允许使用定义的接口进行递归类型约束在新的 Go2 泛型草案中,允许您强制泛型类型及其方法之间的复杂关系。
以上是如何在 Go 2 泛型中定义递归类型约束?的详细内容。更多信息请关注PHP中文网其他相关文章!