我想做以下事情:
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
或类似的任何代价?
答案 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_types和https://golang.org/doc/faq#convert_slice_of_interface 这应该让它更清晰。
我建议提供函数(!not methods)来操作[]Model
,而不是将模型切片抽象为更高的类型。