Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-25 05:31:14502parcourir

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
}

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
    }
}

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)

Sortie :

Before, i = 2
myfunc called with 2
After, ret = 4
Returned: 4

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
    }
}

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!

Déclaration:
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