问题陈述:
您寻求一个接受函数并返回其修改版本的函数包装器。此包装器旨在在原始函数调用之前和之后注入自定义代码执行。
解决方案:
在 Go 中,您可以通过利用函数文字来实现此目的。给定特定的函数签名,可以创建包装函数来接收和返回具有相同签名的函数。包装函数包含所需的自定义行为。
让我们考虑一个示例:
func myfunc(i int) int { fmt.Println("myfunc called with", i) return i * 2 }
修改和增强函数:
以下包装函数添加日志记录调用原始语句之前和之后的语句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 } }
使用和演示:
为了说明,包装的函数被分配给一个变量,并且执行:
wf := wrap(myfunc) ret := wf(2) fmt.Println("Returned:", ret)
输出:
Before, i = 2 myfunc called with 2 After, ret = 4 Returned: 4
扩展到多种函数类型:
这个概念可以扩展到支持通过为每个不同类型创建单独的包装函数来包装具有不同参数和返回类型的函数。例如,包装没有参数或返回类型的函数:
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 } }
以上是如何在Go中创建函数包装器以在函数执行之前和之后注入代码?的详细内容。更多信息请关注PHP中文网其他相关文章!