2017-04-26 4 views
-1

Ich mag würde so etwas wie die folgenden Funktionen ausführen:eine Schnittstelle erstellen, die eine Scheibe eine andere Schnittstelle ist

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

Damit die Struktur Models ist auch eine Schnittstelle und durch eine Scheibe der structs bekommen umgesetzt würden das implementieren Model. Etwa wie folgt:

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 
} 

Offensichtlich wirft der obige Code Fehler und ist nicht möglich. Aber gibt es einen Code, der im Prinzip die gleiche Funktionalität erzeugt? Ohne reflect oder etwas teures so zu verwenden?

+0

Ihre Frage ist ziemlich unklar. Bitte klären Sie, was "dies" in "Offensichtlich ist das nicht möglich" bedeutet. – nos

+0

"dies" bedeutet, dass der Code, den ich oben habe, Fehler für mich warf. Frage bearbeitet, um klarer zu sein. – Benjam

Antwort

1

Offensichtlich ein einfaches

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

funktioniert.

Also, was ist Ihre eigentliche Frage? Bitte beachten Sie auch https://golang.org/doc/faq#covariant_types und https://golang.org/doc/faq#convert_slice_of_interface Was sollte es ein bisschen klarer machen.

Ich würde empfehlen, Funktion (! Nicht Methoden) zu []Model zu betreiben und nicht die Scheibe-Modell in einen höheren Typ zu abstrahieren.

+0

Ich möchte die Tatsache erzwingen, dass 'Foos' eine Scheibe von' Model' ist. Nicht nur seine eigene Schnittstelle namens 'Models'. Das Slice wird in eine Funktion übergeben, in der Methoden für die Elemente im Slice ausgeführt werden, die sich auf der Schnittstelle 'Model' befinden. Ich kann also nicht einfach eine neue Schnittstelle erstellen, da dies kein richtiger Typhinweis für die Funktion ist, die das Segment aufnimmt. – Benjam

+0

Danke für die Antwort, obwohl. Ich habe über den Code nachgedacht, und was ich zu tun hoffe, scheint einfach nicht möglich zu sein. – Benjam

Verwandte Themen