Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-11-25 05:31:14
Original
514 Leute haben es durchsucht

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
}
Nach dem Login kopieren

Ä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
    }
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

Ausgabe:

Before, i = 2
myfunc called with 2
After, ret = 4
Returned: 4
Nach dem Login kopieren

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
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage