首页 > 后端开发 > Golang > 如何在Go中创建函数包装器以在函数执行之前和之后注入代码?

如何在Go中创建函数包装器以在函数执行之前和之后注入代码?

Mary-Kate Olsen
发布: 2024-11-25 05:31:14
原创
563 人浏览过

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

Go 中的函数包装器

问题陈述:
您寻求一个接受函数并返回其修改版本的函数包装器。此包装器旨在在原始函数调用之前和之后注入自定义代码执行。

解决方案:
在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板