我有一个界面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,但在传递给容器结构时却没有。我也不能将对象传递给容器实例化。
2 回答

神不在的星期二
TA贡献1963条经验 获得超6个赞
Foo1
不执行FooInterface
。*Foo1
做。无论接口是用作函数参数的类型还是用作约束,都是如此。
这就是为什么您将&foo1
(type *Foo1
) 传递给TakesFooInterface
而不是foo1
(type Foo1
) 的原因。
同样对于类型参数,您应该实例化通用类型*Foo1
:
fc := FooContainer[*Foo1]{}

jeck猫
TA贡献1909条经验 获得超7个赞
我假设你的 TakesFooInterface 是这样的:
func TakesFooInterface(foo1 FooInterface) { ... }
然后调用 TakesFooInterface(foo1) 编译失败,因为 foo1 没有实现 FooInterface,而是 &foo1。
与您的一般情况相同,该Foo1
类型没有实现 FooInterface ,它需要在方法中访问指针,HasName
但*Foo1
类型需要。
我已经在 Go.Dev 上复制了你的代码和一些尝试:https ://go.dev/play/p/3I2mtabi-ub
- 2 回答
- 0 关注
- 83 浏览
添加回答
举报
0/150
提交
取消