Heim > Artikel > Backend-Entwicklung > Wie kann ich in Go to Inject Code vor und nach der Funktionsausführung einen Funktions-Wrapper erstellen?
Problemstellung:
Sie suchen einen Funktions-Wrapper, der eine Funktion akzeptiert und ihre geänderte Version zurückgibt. Dieser Wrapper zielt darauf ab, die Ausführung von benutzerdefiniertem Code sowohl vor als auch nach dem ursprünglichen Funktionsaufruf einzuschleusen.
Lösung:
In Go können Sie dies durch die Nutzung von Funktionsliteralen erreichen. Bei einer bestimmten Funktionssignatur kann eine Wrapper-Funktion erstellt werden, um Funktionen mit derselben Signatur zu empfangen und zurückzugeben. Die Wrapper-Funktion integriert das gewünschte benutzerdefinierte Verhalten.
Betrachten wir ein Beispiel:
func myfunc(i int) int { fmt.Println("myfunc called with", i) return i * 2 }
Ändern und Erweitern der Funktion:
Die folgende Wrapper-Funktion fügt die Protokollierung hinzu Anweisungen vor und nach dem Aufruf der ursprünglichen myfunc:
func wrap(f func(i int) int) func(i int) int { return func(i int) (ret int) { fmt.Println("Before, i =", i) ret = f(i) // Invokes the provided function fmt.Println("After, ret =", ret) return } }
Verwendung und Demonstration:
Zur Veranschaulichung wird die umschlossene Funktion einer Variablen zugewiesen und ausgeführt:
wf := wrap(myfunc) ret := wf(2) fmt.Println("Returned:", ret)
Ausgabe:
Before, i = 2 myfunc called with 2 After, ret = 4 Returned: 4
Erweiterung auf mehrere Funktionstypen:
Dieses Konzept kann erweitert werden, um Wrapper-Funktionen mit unterschiedlichen Parameter- und Rückgabetypen zu unterstützen, indem ein separater Wrapper erstellt wird Funktionen für jeden einzelnen Typ. Zum Beispiel Wrapping-Funktionen ohne Parameter oder Rückgabetypen:
func wrap(f func()) func() { return func() { fmt.Println("Before func()") f() fmt.Println("After func()") } } func wrapInt2Int(f func(i int) int) func(i int) int { return func(i int) (ret int) { fmt.Println("Before func(i int) (ret int), i =", i) ret = f(i) fmt.Println("After func(i int) (ret int), ret =", ret) return } }
Das obige ist der detaillierte Inhalt vonWie kann ich in Go to Inject Code vor und nach der Funktionsausführung einen Funktions-Wrapper erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!