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.
Ja, das ist möglich. Sie haben 2 (3) Optionen:
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)
.
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% Wenn f
ein Wert vom Typ Foo
ist, liefert der Ausdruck f.A
einen Funktionswert vom Typ func()
mit implizitem Empfängerwert f
.
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 ).
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:
Probieren Sie dies auf dem Gehe Spielplatz aus.
Tags und Links go