golang - Übergeben Sie die Methode, um zu funktionieren

8

Ich bin neugierig, ob das in Go möglich ist. Ich habe einen Typ mit mehreren Methoden. Ist es möglich, eine Funktion zu haben, die eine Methode akzeptiert und sie für den Typ aufrufen kann?

Hier ist ein kleines Beispiel, was ich gerne hätte:

%Vor%

Go denkt, dass Typ Foo eine Methode namens foo() hat, anstatt sie durch den übergebenen Methodennamen zu ersetzen.

    
dangeroushobo 11.08.2016, 13:17
quelle

1 Antwort

22

Ja, das ist möglich. Sie haben 2 (3) Optionen:

Spezifikation: Methodenausdrücke

Der Ausdruck Foo.A ergibt eine Funktion, die äquivalent zu A ist, aber mit einem expliziten Empfänger als erstem Argument; Es hat die Signatur func(f Foo) .

%Vor%

Hier ist der Methodenempfänger explizit. Sie übergeben den Methodennamen (mit dem Typ, zu dem er gehört) nur an bar() , und wenn Sie ihn aufrufen, müssen Sie den tatsächlichen Empfänger übergeben: m(f) .

Ausgabe wie erwartet (versuchen Sie es auf dem Go Playground ):

%Vor%

Spezifikation: Methodenwerte

Wenn f ein Wert vom Typ Foo ist, liefert der Ausdruck f.A einen Funktionswert vom Typ func() mit implizitem Empfängerwert f .

%Vor%

Beachten Sie, dass hier der Methodenempfänger implizit ist, er wird mit dem an bar() übergebenen Funktionswert gespeichert und so aufgerufen, ohne ihn explizit anzugeben: m() .

Die Ausgabe ist die gleiche (versuchen Sie es auf dem Go Playground ).

(Der Vollständigkeit halber: Reflexion )

Sie sind schlechter als bisherige Lösungen (sowohl in der Leistung als auch in der "Sicherheit"), aber Sie könnten den Namen der Methode als string -Wert übergeben und dann die reflect Paket, um die Methode unter diesem Namen aufzurufen. Es könnte so aussehen:

%Vor%

Probieren Sie dies auf dem Gehe Spielplatz aus.

    
icza 11.08.2016, 13:24
quelle

Tags und Links