我有一个接口
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
)。
*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