我在Go中有一些通用代码,其中有一个“主”类型有一个通用参数,还有一些“从”类型应该共享相同的通用参数。代码如下所示:
type Doer[T any] interface {
ModifyA(*A[T])
}
type B[T any] struct {
}
func NewB[T any]() *B[T] {
return new(B[T])
}
func (b *B[T]) ModifyA(a *A[T]) {
// Do a thing
}
type A[T any] struct{}
func NewA[T any]() A[T] {
return A[T]{}
}
func (a *A[T]) Run(doers ...Doer[T]) {
for _, doer := range doers {
doer.ModifyA(a)
}
}
func main() {
a := new(A[int])
a.Run(NewB()) // error here
}
基本上,用户应该定义
T
在…上
A
然后
T
在…上
B
应该是相同的。这类代码可以在其他支持泛型的语言中使用,但在Go中,我得到了
cannot infer T
注释行处的编译错误(请参阅Go游乐场代码,
here
).在我看来,上的type参数
a
设置为
int
所以上的类型参数
B
也应设置为
int
。我可以打电话
NewB[int]()
相反,但这在我看来过于冗长。为什么会发生这种情况?