2017-04-26 6 views
-1

のスライスであるインターフェースの作成:構造体Modelsもインタフェースであり、構造体のスライスによって実装になるだろうようにするため私は、次のような何かしたいのですが、別のインターフェイス

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) 
} 

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

あなたの質問はかなり不明です。 「明らかにこれはできない」という意味で「これ」が何を意味するのかを明確にしてください。 – nos

+0

上記のコードを意味する「this」は、私のためにエラーを投げた。質問はより明確に編集されました。 – Benjam

答えて

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 を参照してください。少し明確にする必要があります。

[]Modelを操作するための関数(!メソッドではない)を提供し、スライスのモデルをより高い型に抽象化しないことをお勧めします。

+0

私は 'Foos'が' Model'のスライスであるという事実を強制したいと思います。 「モデル」という独自のインターフェースだけではありません。スライスは関数に渡され、 'Model'インタフェース上のスライス内の要素に対してメソッドが実行されます。だから私はそれがスライスを取る機能のための適切なタイプのヒントではないので、新しいインターフェイスを作成することはできません。 – Benjam

+0

回答ありがとうございます。私はコードを見てきましたが、私が望んでいるのは可能ではないようです。 – Benjam

関連する問題