Ich bin ein Newcomer und ich habe heute fast den ganzen Tag mit diesem Problem gekämpft.
Betrachtet habe ich diese:
%Vor%I kann der typedObject-Variablen eine Funktion wie folgt zuweisen:
%Vor%Aber ich muss diese Handler-Funktion als Interface-Variable {} übergeben und dann irgendwie in HandlerType umwandeln, was ich später aufrufen könnte
Ich habe das versucht, aber es wirft einen Fehler auf:
%Vor%ergibt:
Schnittstellenkonvertierung: Schnittstelle ist func (), nicht main.HandlerType
Grundsätzlich muss ich Funktionen mit unterschiedlichen Signaturen ohne zusätzliche Typkonvertierung vor der Registrierung registrieren. Also anstatt dies zu tun:
%Vor%Ich möchte Handler wie folgt registrieren:
%Vor%.. und ich möchte die Reflektion zum Zeitpunkt eines Handleranrufs nicht später einbeziehen
Ist es möglich?
Bearbeiten : Ich habe einen Spielplatz erstellt: Ссылка
So wie ich es verstehe, gibt es keine Möglichkeit, irgendeine beliebige Funktion als Schnittstelle {} zu übergeben und sie dann irgendwie in HandlerType oder einen anderen vordefinierten Funktionstyp umzuwandeln, so dass ich sie ohne Verwendung aufrufen könnte Reflexion?
Edit2 : Ich habe diese Lösung gefunden: Ссылка
Es sollte keine Leistungseinbußen während der Laufzeit mit diesem Code geben. Aber kann jemand eine andere Möglichkeit vorstellen, diese Funktionalität ohne interface {} zu implementieren?
Es gibt eine Reihe kleiner Missverständnisse in Ihrer Frage:
Die Typzusicherung wird nicht zum Umwandeln von Typen verwendet. Es überprüft nur, ob eine Variable vom angegebenen Typ ist, und gibt die Variable als diesen zugrunde liegenden Typ zurück. Diese Operation gibt in Ihrem Fall einen Fehler zurück, was normal ist, da func()
nicht vom Typ HandlerFunc
ist.
Sie müssen nichts tun, um eine Variable als Parameter in einer Funktion zu übergeben, die interface{}
akzeptiert. Jeder Typ implementiert implizit die leere Schnittstelle.
A func()
ist kein HandlerType
, auch wenn HandlerType
durch type HandlerType func()
definiert ist. Die Definition hat damit nichts zu tun.
Was Sie tun möchten, ist nicht möglich. Ich bin kein Experte in der Reflexion, aber ich glaube nicht, dass Reflexion Ihr Problem auch lösen könnte.
Das heißt, Ihre Registrierungsmethode sollte eine Schnittstelle definieren, die alle registrierten Objekte implementieren sollten, und diese Schnittstelle als Parametertyp verwenden. Sehen Sie sich die Methode database/sql
package Register
für ein Beispiel an.
Sie können dies jetzt mit dem reflect.MakeFunc tun. Dort ist ein Beispiel, wie man es macht
Tags und Links go