Übergabe einer beliebigen Funktion als Parameter in Go
Die Übergabe von Funktionen als Parameter in Go ermöglicht die dynamische Erstellung und Ausführung von Code. Es gibt jedoch Einschränkungen hinsichtlich der Arten von Funktionen, die übergeben werden können.
Stellen Sie sich das folgende Szenario vor: Wir möchten eine Dekoratorfunktion erstellen, die jede Funktion umschließen kann, die einen Parameter akzeptiert und einen einzelnen Wert zurückgibt. Um Funktionen zu verarbeiten, die Interface{}-Typen akzeptieren oder zurückgeben, können wir eine Dekoratorfunktion mit func(interface{}) interface{} als Argument definieren.
Es ist jedoch nicht möglich, eine Funktion vom Typ func zu konvertieren (string) string implizit in einen Typ von func(interface{}) interface{} umwandeln. Dies liegt daran, dass die Parameter- und Rückgabetypmechanik zwischen den Funktionen unterschiedlich ist. Die Übergabe eines Interface{}-Arguments garantiert nicht die Kompatibilität mit allen Typen.
Zum Beispiel empfängt eine Funktion, die eine Struktur als Argument akzeptiert, einzelne Mitglieder dieser Struktur. Im Gegensatz dazu erhält eine Funktion, die eine Schnittstelle{} akzeptiert, die diese Struktur enthält, zwei Wörter: eines für den Typ und eines für den Zeiger auf die Struktur.
Lösung
Ohne Generika gibt es keinen direkten Weg, diese Funktionalität zu erreichen. Als Workaround können wir jedoch eine Adapterfunktion verwenden:
// Adapter function for func(string) string to func(interface{}) interface{} func adapter(inner func(string) string) func(interface{}) interface{} { return func(arg interface{}) interface{} { // Convert the interface{} arg to a string argString := arg.(string) // Call the inner function with the converted string result := inner(argString) // Return the result return result } }
Jetzt können wir funcB mithilfe der Adapterfunktion an den Decorator übergeben:
fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))
Das obige ist der detaillierte Inhalt vonWie kann ich unter Berücksichtigung von Typkompatibilitätseinschränkungen eine beliebige Funktion als Parameter in Go übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!