interface {} zur Konvertierung des Funktionstyps

8

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?

    
user3668351 07.07.2014, 13:11
quelle

3 Antworten

5

Sie können nicht, es ist ein anderer Typ, Sie könnten einfach object.(func()) , object.(func() string) usw. verwenden.

%Vor%     
OneOfOne 07.07.2014, 13:26
quelle
6

Es gibt eine Reihe kleiner Missverständnisse in Ihrer Frage:

  1. 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.

  2. 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.

  3. 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.

    
Elwinar 07.07.2014 13:27
quelle
0

Sie können dies jetzt mit dem reflect.MakeFunc tun. Dort ist ein Beispiel, wie man es macht

    
notzippy 11.03.2017 21:06
quelle

Tags und Links