Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich in Go to Inject Code vor und nach der Funktionsausführung einen Funktions-Wrapper erstellen?

Wie kann ich in Go to Inject Code vor und nach der Funktionsausführung einen Funktions-Wrapper erstellen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-25 05:31:14502Durchsuche

How Can I Create a Function Wrapper in Go to Inject Code Before and After Function Execution?

Funktions-Wrapper in Go

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn