预定义类型的递归类型约束
在 Go 泛型中,可以使用接口指定泛型类型的类型约束。然而,定义一个需要实现带有泛型类型本身参数的方法的约束可能具有挑战性。
Go 泛型的当前草案不允许递归类型约束,使其无法实现所需的行为。例如,考虑以下接口:
type Lesser interface { Less(rhs Lesser) bool }
我们可以为自定义类型实现此接口,例如 Int:
type Int int func (lhs Int) Less(rhs Int) bool { return lhs < rhs }
但是,以下代码将无法编译,因为Int 不满足 Lesser 接口:
func IsLess[T Lesser](lhs, rhs T) bool { return lhs.Less(rhs) } func main() { IsLess[Int](Int(10), Int(20)) }
A解决此限制的方法是定义一个通用接口,将自身引用为类型参数:
type Lesser[T any] interface { Less(T) bool }
此接口指定任何实现 Lesser 接口的类型都必须有一个 Less 方法,该方法采用相同的参数
然后我们可以使用这个通用接口定义 IsLess 函数:
func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
现在,我们可以实现满足以下条件的自定义类型Lesser 约束:
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 }
将 IsLess 函数与这些自定义类型一起使用将产生正确的行为:
func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Orange(30), Orange(15))) // false }
此解决方案通过要求实现带有泛型类型参数的方法。
以上是如何在 Go 泛型中实现递归类型约束?的详细内容。更多信息请关注PHP中文网其他相关文章!