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

我有一个界面


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


杨魅力
浏览 129回答 2
2回答

神不在的星期二

Foo1不执行FooInterface。*Foo1做。无论接口是用作函数参数的类型还是用作约束,都是如此。这就是为什么您将&foo1(type *Foo1) 传递给TakesFooInterface而不是foo1(type Foo1) 的原因。同样对于类型参数,您应该实例化通用类型*Foo1:fc := FooContainer[*Foo1]{}

jeck猫

我假设你的 TakesFooInterface 是这样的:func TakesFooInterface(foo1 FooInterface) {    ... }然后调用 TakesFooInterface(foo1) 编译失败,因为 foo1 没有实现 FooInterface,而是 &foo1。与您的一般情况相同,该Foo1类型没有实现 FooInterface ,它需要在方法中访问指针,HasName但*Foo1类型需要。我已经在 Go.Dev 上复制了你的代码和一些尝试:https ://go.dev/play/p/3I2mtabi-ub
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go