2017-01-26 2 views
3

Ich versuche, eine klonbare Schnittstelle zu erstellen und einige Probleme zu bekommen, Strukturen zu bekommen, um die Schnittstelle zu implementieren. Es scheint, dass dies eine Grenze des Gehens ist, die in vielen anderen Sprachen nicht ist. Ich versuche zu verstehen, warum dieses Limit gerechtfertigt ist.Schnittstelle, die es selbst zurückgibt (klonbar)

var _ Cloneable = test{} 

type Cloneable interface { 
    Clone() Cloneable 
} 

type test struct { 
} 

func (t *test) Clone() *test { 
    c := *t 
    return &c 
} 

Spielplatz: https://play.golang.org/p/Kugatx3Zpw

Followup Frage, da es scheint immer noch seltsam für mich. Dies gilt auch kompilieren nicht

var _ Cloneable = &test{} 

type Cloneable interface { 
    Clone() Cloneable 
} 

type Cloneable2 interface { 
    Clone() Cloneable2 
} 

type test struct { 
} 

func (t *test) Clone() Cloneable2 { 
    c := *t 
    return &c 
} 

Spielplatz: https://play.golang.org/p/jlyMDPF1WB

+0

das Ändern des Rückgabetyps zu einer Schnittstelle und nicht zu einer Struktur macht es nicht weniger verschieden. Die Methodensignaturen 'Clone() Cloneable' und' Clone() Cloneable2' sind nicht identisch. – JimB

+0

Das ist eine Wahl der Sprache, damit beide nicht richtig funktionieren? Ich meine, sie können einander zugeordnet werden. Ich schätze, ich versuche zu verstehen, warum das nicht funktioniert –

+0

[Assignability] (https://golang.org/ref/spec#Assignability) bedeutet nicht, dass die Typen gleich sind. –

Antwort

0

ich diesen Thread gefunden, die darüber spricht und die Antwort scheint covariant zu unterstützen Funktionstypen würden die Sprache für wenig Nutzen schwerer verständlich machen. https://github.com/golang/go/issues/7512

Zumindest haben sie sich bewusst dafür entschieden, eine von den meisten anderen Sprachen unterstützte Funktion nicht zu unterstützen. Ich kaufe es nicht wirklich, aber naja ...

2

eine Interface-Methode, um das Argument zu erfüllen und Rückgabetypen müssen die gleichen Typen in der Interface-Deklaration verwendet verwenden. Die Clone Methode muss ein Cloneable zurückgeben, die Schnittstelle zu erfüllen:

func (t *test) Clone() Cloneable { 
    c := *t 
    return &c 
} 

Die Clone Methode keine *test oder Cloneable2, weil diese Art ist nicht der Cloneabl e-Typ zurückgeben kann.

Der Zeigertyp implementiert die Schnittstelle:

var _ Cloneable = &test{} 

Da die test Typ Cloneable die Schnittstelle für die Clone Verfahren genügen muß zu kompilieren, diese compile time assertion ist nicht erforderlich.

playground example

(Die Frage ein sich bewegendes Ziel ist. Dies ist eine Antwort auf zwei vorherigen Änderungen in Frage.)

+0

Für meinen Anwendungsfall lebt die Schnittstelle nicht im selben Paket. Muss ich es im selben Paket neu deklarieren? –

+0

Aus Java kommend erscheint es komisch, dass ich nicht genauer beschreiben kann, was es zurückgibt. –

+0

Verwenden Sie die eine Definition der Schnittstelle. Deklariere es nicht neu. –

Verwandte Themen