go - 如何实现 Python functools.wraps 等效?

标签 go functional-programming

我知道我可以通过返回函数在 Go 中包装函数,如何在 Go 中实现等效的 Python functools.wraps?如何将属性附加到 Go 中的函数?就像下面的 Python 代码。

from functools import wraps

def d(f):
    def wrapper(*args):
        f(*args)

    return wrapper

def d_wraps(f):
    @wraps(f)
    def wrapper(*args):
        f(*args)

    return wrapper

@d
def f(a=''):
    print a

@d_wraps
def g(a=''):
    print a

if __name__ == '__main__':
    print 'function name: ', f.__name__
    f('abc')

    print 'function name: ', g.__name__
    g('abc')

d 不改变函数名,d_wraps 改变函数名。结果是

function name:  wrapper
abc
function name:  g
abc

我想在运行时使用包装函数作为键。所以我想在包裹后保持函数名称不变。如何在 Go 中实现 d_wraps 所做的工作?

最佳答案

How to attach attribute to functions in Go?

不可以,您不能在 Go 中将属性附加到函数。

How to implement the job that d_wraps does in Go?

您可以实现另一个函数调用您的函数,并使用新名称调用该函数。

package main

import "fmt"

func main() {
   g_warp("abc")
}

func g(a string){
   fmt.Println(a);
}

func g_warp(a string){
   g(a+"_mysuffix");
}

如果要改变函数内容但使用相同的函数名,可以使用全局函数变量:

package main

import (
    "fmt"
)

func main() {
    g = gV2
    g("hello")
}

var g = gV1;

func gV1(a string){
    fmt.Println(a)
}
func gV2(a string){
    gV1(a+"_suffix")
}

如果你有很多函数有相同的包装逻辑,你可以传入原始函数并返回新函数:

package main

import (
    "fmt"
)

func main() {
    g = wrap(g)
    g("hello")
    f = wrap(f)
    f("hello")
}

var g = gV1;

func gV1(a string){
    fmt.Println(a)
}
var f = fV1;

func fV1(a string){
    fmt.Println(a+" "+a)
}
func wrap(originFn func(a string)) func(a string){
    return func(a string){
         originFn(a+"_suffix")
    }
}

关于go - 如何实现 Python functools.wraps 等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51804831/

相关文章:

functional-programming - 编写方案函数,在给定要搜索的字符的情况下,将列表中的元素加倍

Perl 5 - 迭代器

regex - 如何使用正则表达式在 golang 的括号内获取所有内容

azure - 将 Golang 环境变量注入(inject) Azure Pipeline

go - 将结构从字符串数组更改为深度数组

functional-programming - 评估期间堆栈溢出(循环递归?)。奥卡米尔

python - 在 GAE 中使用 "golang"的成本/性能优势是什么

go - 由于错误 : could not attach to pid XXX: could not open debug info,无法调试 golang 应用程序 delve

PHP 从空查询中获取关联

python - 使用具有多个参数的 map