为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨魅力 2022-12-26 15:41:37
我有一个界面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]{}


查看完整回答
反对 回复 2022-12-26
?
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


查看完整回答
反对 回复 2022-12-26
  • 2 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号