É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!