小编Mar*_*ský的帖子

使用定义的类型而不是类型文字的递归类型约束?

在 Go2 泛型中,截至当前草案,我可以使用接口指定泛型类型的类型约束。

import "fmt"

type Stringer interface {
    String() string
}

func Print[T Stringer](value T) {
    fmt.Println(value.String())
}
Run Code Online (Sandbox Code Playgroud)

这样,我可以指定该类型必须实现一个方法。但是,我没有看到任何方法可以强制执行方法,该方法本身具有泛型类型的参数。

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))
}
Run Code Online (Sandbox Code Playgroud)

退出时

Int does not satisfy Lesser: wrong method signature
    got  func (Int).Less(rhs Int) bool
    want func (Lesser).Less(rhs Lesser) bool
Run Code Online (Sandbox Code Playgroud)

带有合同的原始草案将使这成为可能,但新草案则不然。

也可以通过以下方式完成,但这会让您一遍又一遍地重复相同的约束,从而阻止 …

generics recursion interface go

2
推荐指数
1
解决办法
1134
查看次数

标签 统计

generics ×1

go ×1

interface ×1

recursion ×1