Ich bin ein Go-Neuling und ich habe heute fast den ganzen Tag mit diesem Problem gekämpft.Schnittstelle {} zur Funktion Typ Umwandlung
Unter Berücksichtigung Ich habe diese:
type HandlerType func()
var object interface{}
var typedObject HandlerType
I kann eine Funktion der typedObject Variable wie folgt vergeben:
typedHandler = func() {
fmt.Println("in a handler!\n")
}
Aber was ich tun müssen, ist, dass die Handler-Funktion passieren, wie eine Schnittstelle {} Variable und dann irgendwie in HandlerType konvertieren, die ich später anrufen könnte
Ich habe das aber versucht es wirft einen Fehler:
typedHandler = object.(HandlerType)
Ergebnisse in:
interface conversion: interface is func(), not main.HandlerType
Grundsätzlich muss ich vor der Registrierung ohne zusätzliche Typkonvertierungsfunktionen mit unterschiedlichen Signaturen registrieren. Anstatt also, dies zu tun:
registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))
Ich möchte Handler registrieren wie folgt aus:
registerHandler(func() string { ... })
registerHandler(func() { ... })
.. und ich will nicht Reflexion zum Zeitpunkt eines Handlers Aufruf beteiligen später
Ist es möglich?
bearbeiten: Ich habe einen Spielplatz erstellt: http://play.golang.org/p/UlwqkHjt_P
So wie ich verstehe, dass es keine Möglichkeit gibt, eine beliebige Funktion als Schnittstelle {} und dann irgendwie wandeln es in HandlerType oder einem anderen vordefinierten passieren Funktionstyp, so dass ich es ohne Reflektion aufrufen könnte?
EDIT2: Ich habe kam mit dieser Lösung: http://play.golang.org/p/4gUxsgmiPf
Es nicht mit diesem Code keine Leistungseinbußen während der Laufzeit sein sollte. Aber kann jemand einen anderen Weg vorstellen, diese Funktionalität ohne Schnittstelle {} zu implementieren?
anzeigen zu tun. 'typedHandler = object. (HandlerType)' ** wird ** funktionieren, wenn das Objekt (vom Typ 'interface {}') wirklich ein Objekt 'HandlerType' enthält. Zeige Code, der auf dem Spielplatz spielbar ist. – Volker
Noch eins: Wenn du ein Go-Neuling bist, solltest du 'interface {}' vermeiden. Finden Sie einen anderen Weg, Autor richtiger Go-Code. Ein Newcomer, der für 'interface {}' magie wie Codetranskription aus einer anderen Sprache riecht. – Volker
Ich habe einen Spielplatz hinzugefügt, wo ich denke, ich habe klar gemacht, was ich erreichen möchte :) – user3668351