如何满足通过嵌入泛型实现的约束?



我有一个接口

type FooInterface interface {
HasName() bool
}

它有一个基本实现,我打算在FooInterface的其他实现中使用

type FooBoilerplate struct {
hasName bool
}
func (f *FooBoilerplate) HasName() bool {
return f.hasName
}

一样
type Foo1 struct {
fooId int
FooBoilerplate
}
func (f *Foo1) GetId() int {
return f.fooId
}

我想用泛型为FooInterface创建一个容器类

type FooContainer[T FooInterface] struct {
list []T
}
func (fc *FooContainer[T]) AddItem() {
var t T
fc.list = append(fc.list, t)
}

然而,当我尝试实例化容器

时,我得到编译错误
func RunThis() {
foo1 := Foo1{FooBoilerplate: FooBoilerplate{hasName: false}}
// works fine
TakesFooInterface(&foo1)
// doesnt compile
fc := FooContainer[Foo1]{}
fc.AddItem()
}

不知道为什么当传递给函数时,Foo1被视为实现了FooInterface,但当传递给容器结构时却不是。我也不能将对象传递给容器实例化。

Foo1不实现FooInterface*Foo1。无论接口是用作函数实参的类型还是用作约束,都是如此。

这就是为什么您将&foo1(类型*Foo1)传递给TakesFooInterface而不是foo1(类型Foo1)。

同样,对于type参数,您应该使用*Foo1: 实例化泛型类型。
fc := FooContainer[*Foo1]{}

我假设你的TakesFooInterface是这样的:

func TakesFooInterface(foo1 FooInterface) {
...
}

则调用TakesFooInterface(foo1)编译失败,因为foo1没有实现FooInterface,而是&foo1。

与你的通用情况相同,Foo1类型不实现FooInterface,它需要在方法HasName中的指针访问,但*Foo1类型做到了。

我已经复制了你的代码与一些我在Go上的尝试。戴夫:https://go.dev/play/p/3I2mtabi-ub

最新更新