首页 >后端开发 >Golang >如何在 Go 泛型中实现递归类型约束?

如何在 Go 泛型中实现递归类型约束?

Susan Sarandon
Susan Sarandon原创
2024-12-22 06:57:44522浏览

How Can I Achieve Recursive Type Constraints in Go Generics?

预定义类型的递归类型约束

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn