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