Maison > développement back-end > Golang > Comment puis-je créer un wrapper de fonction dans Go to Inject Code avant et après l'exécution de la fonction ?

Comment puis-je créer un wrapper de fonction dans Go to Inject Code avant et après l'exécution de la fonction ?

Mary-Kate Olsen
Libérer: 2024-11-25 05:31:14
original
553 Les gens l'ont consulté

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

Function Wrapper dans Go

Énoncé du problème :
Vous recherchez un wrapper de fonction qui accepte une fonction et renvoie sa version modifiée. Ce wrapper vise à injecter l'exécution de code personnalisé avant et après l'appel de fonction d'origine.

Solution :
Dans Go, vous pouvez y parvenir en exploitant les littéraux de fonction. Étant donné une signature de fonction spécifique, une fonction wrapper peut être créée pour recevoir et renvoyer des fonctions avec la même signature. La fonction wrapper intègre le comportement personnalisé souhaité.

Prenons un exemple :

func myfunc(i int) int {
    fmt.Println("myfunc called with", i)
    return i * 2
}
Copier après la connexion

Modification et amélioration de la fonction :
La fonction wrapper suivante ajoute la journalisation déclarations avant et après avoir appelé le myfunc d'origine :

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
    }
}
Copier après la connexion

Utilisation et Démonstration :
Pour illustrer, la fonction enveloppée est affectée à une variable et exécutée :

wf := wrap(myfunc)
ret := wf(2)
fmt.Println("Returned:", ret)
Copier après la connexion

Sortie :

Before, i = 2
myfunc called with 2
After, ret = 4
Returned: 4
Copier après la connexion

Extension à plusieurs types de fonctions :
Ce concept peut être étendu pour prendre en charge des fonctions d'encapsulation avec différents types de paramètres et de retour en créant des fonctions wrapper pour chaque type distinct. Par exemple, encapsuler des fonctions sans paramètres ni types de retour :

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
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal