Golang-Funktion zum zurückgeben einer Schnittstelle
Den code unten ist wirklich selbsterklärend.
Kommen, wie kann ich sagen, dass das Ergebnis CreateLion () ein Zeiger auf eine struct, die die Cat-Schnittstelle ist ein Beispiel für die Cat-Schnittstelle, und doch kann ich nicht sagen, dass CreateLion() ist vom Typ "Funktion, gibt die Cat-Schnittstelle."
Was ist die standard-Golang Ansatz zum erreichen dieser Art von Verhalten?
package main
import "fmt"
func main() {
var lion Cat := CreateLion()
lion.Meow()
//this line breaks. Why?
var cf CatFactory = CreateLion
}
type Cat interface {
Meow()
}
type Lion struct {}
func (l Lion) Meow() {
fmt.Println("Roar")
}
//define a functor that returns a Cat interface
type CatFactory func() Cat
//define a function that returns a pointer to a Lion struct
func CreateLion() *Lion {
return &Lion{}
}
Gehen ist nicht Java. Gehen Sie keine erbschaft und keine "ist ein" Konzept. Ihr Versuch, als Modell für die Problematik aussieht wie eine direkte übersetzung von Java zu Gehen. Das wird nicht funktionieren. Technisch Freude miao ' s Antwort ist eine komplette und vernünftige Erklärung. Go ist statisch typisiert und ein
Mit einer Funktion als eine Art ist nicht etwas, was einzigartig für Java, @Volker. Dieser code wird nicht übersetzt, aus Java.
*Lion
ist nicht ein Cat
, auch wenn ein *Lion
zuweisbar ist eine variable vom Typ Cat
; aber abtretbarkeit spielt keine Rolle, während entsprechende Typ-Signaturen. Es gibt keine Notwendigkeit für die Fabriken Gehen. Werfen Sie einen Blick auf, wie die stdlib nicht Dinge, und halt das schreiben von Java-code in Go.Mit einer Funktion als eine Art ist nicht etwas, was einzigartig für Java, @Volker. Dieser code wird nicht übersetzt, aus Java.
InformationsquelleAutor zian | 2016-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
In den meisten Fällen, können Sie ordnen jedem Typ base Typ
interface{}
. Aber die situation ändert sich, wenn der Typ des funktionsparameters ist einmap[T]interface{}
,[]interface{}
oderfunc() interface{}
.In diesem Fall ist der Typ gleich sein muss.
In meinem Anwendungsfall, die Cat-Schnittstelle definiert ist, in ein separates Paket, dass ich nicht importieren möchten, in das Paket, wo der Löwe struct definiert ist. Also ich kann nicht einfach ändern Sie den Rückgabetyp der CreateLion Funktion, wie Sie vorgeschlagen haben.
Sie können nicht zuweisen func struct zu func interface{}. Ähnliche Situation wie []interface{} - []struct. Weil es verschiedene Arten.
Diese Antwort ist schlecht, weil jetzt CreateLion gibt eine Katze, und Sie nicht haben Zugang zu jedem der Lion-spezifische Verhaltensweisen mehr. Macht es Sinn für CatFactory, um wieder eine Katze, aber CreateLion sollte wieder ein Löwe.
Sie haben Zugang zu Lion Methoden: play.golang.org/p/Xsz7NvEm4v5
InformationsquelleAutor Oleksiy Chechel
Ich denke, Sie sollten dieses blog zu Lesen http://blog.golang.org/laws-of-reflection,es ist präzise über die Beziehung zwischen Variablen,Typen und Schnittstellen.
In deinem Beispiel
*Lion
ist anders mitCat
.Können Sie die korrekte Funktion
CreateLion
Erträge aus*Lion
zuCat
.InformationsquelleAutor joy miao
Das problem hier ist, dass statisch typisierte gehen unterscheidet die "das ist eine Funktion zurückgibt, die eine Katze," aus ", das ist eine Funktion zurückgibt, die einen Löwen, das ist eine Katze" Und werden daher nicht akzeptieren, wie die anderen.
Den Weg um dies zu beheben, geben Sie Ihrer Fabrik var genau das, was es erwartet:
InformationsquelleAutor Qudaci