【发布时间】:2021-02-04 15:27:17
【问题描述】:
在目前的草案中,在 Go2 泛型中,我可以使用接口对泛型类型指定类型约束。
import "fmt"
type Stringer interface {
String() string
}
func Print[T Stringer](value T) {
fmt.Println(value.String())
}
这样,我可以指定类型必须实现一个方法。但是,我没有看到任何强制实现方法的方法,因为它本身具有泛型类型的参数。
type Lesser interface {
Less(rhs Lesser) bool
}
type Int int
func (lhs Int) Less(rhs Int) bool {
return lhs < rhs
}
func IsLess[T Lesser](lhs, rhs T) bool {
return lhs.Less(rhs)
}
func main() {
IsLess[Int](Int(10), Int(20))
}
退出
Int does not satisfy Lesser: wrong method signature
got func (Int).Less(rhs Int) bool
want func (Lesser).Less(rhs Lesser) bool
带有合同的原始草案将使这成为可能,但新草案却不行。
也可以通过以下方式完成,但这会让您一遍又一遍地重复相同的约束,制动 DRY(而 DRY 代码是泛型的目的)。如果所需的接口有多个方法,也会使代码更加笨拙。
func IsLess[T interface { Less(T) bool }](lhs, rhs, T) bool {
return lhs.Less(rhs)
}
有没有办法在新草案中使用预定义的界面来做到这一点?
【问题讨论】:
-
嗯,首先,接口中的函数有签名
Less(rhs Lesser) bool和你的实现有签名Less(rhs Int) bool,不一样。 -
当然可以,但是如何为
func (lhs T) Less(rhs T) bool {}创建一个通用约束? -
草稿中有一段关于此的内容:go.googlesource.com/proposal/+/refs/heads/master/design/… 看来没有简单的方法可以做到这一点。
-
@torek,考虑使用具有多种方法的接口来执行此操作。结果将无法读取。
-
老实说,我今天刚刚查看了 Go 中仿制药的情况,我真的很失望,合同被削减了。我发现合同真的很棒。并且可能更干燥,因为您只需定义整个文件/包的通用类型。此外,当前草案中的一些内容允许您对具有 > 和