Heim > Backend-Entwicklung > Golang > Wie können Funktions-Wrapper in Go Code vor und nach der Funktionsausführung einschleusen?

Wie können Funktions-Wrapper in Go Code vor und nach der Funktionsausführung einschleusen?

Susan Sarandon
Freigeben: 2024-11-29 10:52:09
Original
596 Leute haben es durchsucht

How Can Function Wrappers in Go Inject Code Before and After Function Execution?

Funktions-Wrapper in Go: Code in Funktionsausführungen einfügen

Durch das Erstellen von Funktions-Wrappern können Entwickler vorhandene Funktionen verbessern, indem sie Code vor und nach ihren einfügen Ausführung. In Go erfordert diese Technik die Kenntnis der Signatur der Funktion, die umschlossen wird, und die Rückgabe eines Funktionswerts desselben Typs.


Im folgenden Beispiel definieren wir eine Wrapper-Funktion „wrapper“, die eine Funktion f und akzeptiert gibt eine neue Funktion zurück, die in Wrap eingeschlossen ist. Diese neue Funktion hat die gleiche Signatur wie f. Vor und nach der Ausführung von f gibt Wrap Nachrichten an die Konsole aus.

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

Um dies zu veranschaulichen, haben wir eine Funktion namens myfunc, die die Eingabenummer verdoppelt:

func myfunc(i int) int {
    fmt.Println("myfunc called with", i)
    return i * 2
}
Nach dem Login kopieren

Indem wir myfunc mit der Wrap-Funktion umschließen, können wir unsere eigene anhängen Funktionalität.

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

Unterstützung mehrerer Funktionstypen

Da Go keine Generika enthält, muss eine spezifische Wrapper-Funktion erstellt werden für jeden zu unterstützenden Funktionstyp. Alternativ kann mit „reflect.MakeFunc()“ eine Wrapper-Funktion geschrieben werden, um mehrere Funktionstypen zu verarbeiten, obwohl dieser Ansatz zu Komplexität führen kann.

Für Funktionen ohne Parameter oder Rückgabewerte kann die Wrap-Funktion leicht modifiziert werden:

func wrap(f interface{}) interface{} {
    switch f2 := f.(type) {
    case func(i int) (ret int):
        // ...
    case func():
        // ...
    }
    return nil
}
Nach dem Login kopieren

Zusammenfassend lässt sich sagen, dass Funktions-Wrapper in Go eine Möglichkeit bieten, das Verhalten vorhandener Funktionen zu ändern, ohne deren Quellcode zu ändern. Entwickler können diese Wrapper anpassen, um bestimmte Anforderungen zu erfüllen und die Codeflexibilität zu verbessern.

Das obige ist der detaillierte Inhalt vonWie können Funktions-Wrapper in Go Code vor und nach der Funktionsausführung einschleusen?. 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