首页 > 后端开发 > Golang > 如何使用自定义接口在 Go 泛型中定义递归类型约束?

如何使用自定义接口在 Go 泛型中定义递归类型约束?

Barbara Streisand
发布: 2025-01-04 09:28:34
原创
1014 人浏览过

How Can I Define Recursive Type Constraints in Go Generics Using Custom Interfaces?

使用自定义接口定义递归类型约束

在 Go 泛型中,可以使用接口定义类型约束。但是,标准草案不允许递归类型约束,其中类型的方法具有泛型类型的参数。

问题场景

考虑以下定义接口的代码 Lesser 和一个函数IsLess:

type Lesser interface {
    Less(rhs Lesser) bool
}

func IsLess[T Lesser](lhs, rhs T) bool {
    return lhs.Less(rhs)
}
登录后复制

运行此代码会导致错误:

Int does not satisfy Lesser: wrong method signature
    got  func (Int).Less(rhs Int) bool
    want func (Lesser).Less(rhs Lesser) bool
登录后复制

解决方案

要解决此问题,我们可以定义较小的界面和IsLess 函数如下:

type Lesser[T any] interface {
    Less(T) bool
}

func IsLess[T Lesser[T]](x, y T) bool {
    return x.Less(y)
}
登录后复制

在此定义中,Lesser 接口采用类型参数 T 并声明一个方法 Less 接受类型为 T 的参数。 IsLess 函数约束泛型类型 T 来实现 Lesser[T] 接口。

用法示例

此处是一个使用这个的例子解决方案:

type Apple int

func (a Apple) Less(other Apple) bool {
    return a < other
}

func main() {
    fmt.Println(IsLess(Apple(10), Apple(20)))   // true
    fmt.Println(IsLess(Apple(20), Orange(30))) // compilation error: type mismatch
}
登录后复制

在此示例中,Apple 类型满足 Lesser[Apple] 接口,因为其 Less 方法接受参数类型 Apple。然后,IsLess 函数可用于比较两个 Apple 值。

此方法允许递归类型约束,使您能够强制类型的方法具有参数通用类型。

以上是如何使用自定义接口在 Go 泛型中定义递归类型约束?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板