2017-07-12 3 views
1

Ich komme aus Java und derzeit versuchen zu lernen, gehen. Ich struggeling mit interfaceInterface-Methode mit mehreren Rückgabetypen

bedenken Sie:

type Generatorer interface { 
    getValue() // which type should I put here ? 
} 

type StringGenerator struct { 
    length   int 
} 

type IntGenerator struct { 
    min   int 
    max   int 
} 

func (g StringGenerator) getValue() string { 
    return "randomString" 
} 

func (g IntGenerator) getValue() int { 
    return 1 
} 

Ich möchte die getValue() Funktion zurückgeben ein string oder int, je nachdem, ob sie von StringGenerator oder IntGenerator

genannt Wenn ich versuche, dies zu kompilieren, bekomme ich folgenden Fehler:

kann s nicht verwenden (Typ * StringGenerator) als Typ Generatorer in Array oder Scheibe wörtliche: * StringGenerator nicht implementiert Generatorer (falsche Typ für getValue-Methode)

haben getValue() string
getValue wollen ()

Wie kann ich das erreichen?

+1

Was versuchen Sie zu erreichen? Wie würden Sie das gleiche in Java machen? Welchen Nutzen hat eine Schnittstelle, die je nach Implementierung unterschiedliche Inhalte zurückgeben kann? Das klingt nicht nach dem richtigen Job für eine Schnittstelle zu mir (weder in Go noch in Java). –

+0

@VincentvanderWeele Ich habe meinen Code auf Stackreview hier eingereicht: https://codereview.stackexchange.com/questions/168955/generate-thousands-of-json-documents-in-go. Die Frage erklärt das Ziel des Projekts und warum brauche ich eine Schnittstelle, um mein Problem zu lösen! – felix

+0

Ah, alles ist dynamisch, das erklärt! Go's Hauptstärke liegt in statisch getippten Problemen, daher würde ich sagen, dass dieses Problem nicht die beste Übereinstimmung für die Sprache ist. Natürlich ist es möglich und genauso wie in Java [Reflexion] (https://golang.org/pkg/reflect/) ist höchstwahrscheinlich die Lösung. –

Antwort

2

Sie konnte es auf diese Weise erreichen:

type Generatorer interface { 
    getValue() interface{} 
} 

type StringGenerator struct { 
    length   int 
} 

type IntGenerator struct { 
    min   int 
    max   int 
} 

func (g StringGenerator) getValue() interface{} { 
    return "randomString" 
} 

func (g IntGenerator) getValue() interface{} { 
    return 1 
} 

Die leere Schnittstelle ermöglicht es jedem Wert. Dies ermöglicht generischen Code, verhindert aber grundsätzlich die Verwendung des sehr leistungsfähigen Typsystems von Go.

In Ihrem Beispiel, wenn Sie die getValue Funktion verwenden, werden Sie eine Variable vom Typ interface{} bekommen und wenn Sie mit ihm arbeiten wollen, müssen Sie wissen, ob es tatsächlich ein String oder ein int ist: Sie werden eine Menge brauchen von reflect macht Ihren Code langsam.

Kommend von Python wurde ich verwendet, um sehr generisch zu programmieren. Als ich Go lernte, musste ich aufhören, so zu denken.

Was das in Ihrem speziellen Fall bedeutet, kann ich nicht sagen, weil ich nicht weiß, was StringGenerator und IntGenerator für verwendet werden.

0

Sie können dies nicht so erreichen, wie Sie es möchten. Sie können die Funktion jedoch als

deklarieren, wenn Sie verschiedene Typen in verschiedenen Implementierungen zurückgeben möchten.