创建一个接口,它是另一个接口的一个切片

时间:2017-04-26 07:08:14

标签: go

我想做以下事情:

type Model interface {
    EntityType() string
    GetKey() *datastore.Key
    SetKey(*datastore.Key) error
    PreSave(context.Context) error
    PostSave(context.Context) error
    PostLoad(context.Context) error
}

type Models []Model interface {
    Prepare(int) ([]Model, error)
}

因此结构Models也是一个接口,并且将通过实现Model的结构的一部分来实现。如下所示:

type Foo struct {
    key   *datastore.Key `datastore:"_"`
    // ... other things here
}

// assume all Model interface funcs are here and valid

type Foos []Foo

func (f *Foos) Prepare (num int) ([]Model, error) {
    // do the preparations for Foo slice
}

显然,上面的代码会抛出错误而且不可能。但是有一些代码会产生基本相同的功能吗?没有使用reflect或类似的任何代价?

1 个答案:

答案 0 :(得分:1)

显然很简单

type Models interface {
    Prepare(int) ([]Model, error)
}
type Foos []Foo
func (f Foos) Prepare(num int) ([]Model, error) {
    // do the preparations for Foo slice
    return nil, nil
}
func main() {
    foos := Foos{}
    models := Models(foos)
    models.Prepare(17)
}

作品。

那你的实际问题是什么?另请参阅https://golang.org/doc/faq#covariant_typeshttps://golang.org/doc/faq#convert_slice_of_interface 这应该让它更清晰。

我建议提供函数(!not methods)来操作[]Model,而不是将模型切片抽象为更高的类型。