In Go ist es möglich, einen Funktions-Wrapper zu erstellen, der eine Funktion als Eingabe akzeptiert und eine verpackte Version davon zurückgibt. Dies ermöglicht das Einfügen von Code vor und nach der Ausführung der umschlossenen Funktion.
Um einen Funktions-Wrapper zu definieren, müssen Sie die Signatur der Funktion angeben, die Sie umschließen möchten. Hier ist ein Beispiel:
func funcWrapper(myFunc interface{}) { fmt.Println("Before") //call myFunc fmt.Println("After") }
In diesem Beispiel nimmt der Funktionswrapper eine Variable vom Typ interface{} als Eingabe, wodurch er Funktionen mit unterschiedlichen Signaturen akzeptieren kann. Wenn die umschlossene Funktion aufgerufen wird, wird der Code vor und nach dem Funktionsaufruf ausgeführt.
Dieser Ansatz erfordert jedoch, dass Sie die Signatur der Funktion angeben, die Sie umschließen möchten. Eine flexiblere Lösung besteht darin, ein Funktionsliteral zu verwenden, das Funktionen jeder Signatur akzeptieren kann:
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) fmt.Println("After, ret =", ret) return } }
Diese Wrapper-Funktion akzeptiert eine Funktion, die ein int als Eingabe akzeptiert und ein int zurückgibt. Anschließend wird eine neue Funktion zurückgegeben, die den Code vor und nach dem Aufruf der umschlossenen Funktion ausführt.
Um den Wrapper zu verwenden, übergeben Sie die Funktion, die Sie umschließen möchten, als Argument:
wf := wrap(myfunc) ret := wf(2) fmt.Println("Returned:", ret)
Dieses Beispiel umschließt die myfunc-Funktion und gibt die Eingabe- und Rückgabewerte der umschlossenen Funktion aus.
In Go können Sie separate Wrapper-Funktionen für verschiedene Funktionstypen erstellen, um die Typsicherheit zu gewährleisten und Benutzerfreundlichkeit.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go to Inject Code vor und nach der Funktionsausführung Funktions-Wrapper erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!