Go 如何实现Python functools.wrapps?

Go 如何实现Python functools.wrapps?,go,functional-programming,Go,Functional Programming,我知道我可以在Go-through返回函数中包装函数,bug如何在Go中实现Python-functools.wrapps等价物?如何将属性附加到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)

我知道我可以在Go-through返回函数中包装函数,bug如何在Go中实现Python-functools.wrapps等价物?如何将属性附加到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\u包装
更改函数名。结果是

function name:  wrapper
abc
function name:  g
abc
我想在运行时使用包装函数作为键。所以我想在包装后保持函数名不变。如何实现
d_包装
在Go中所做的工作

如何将属性附加到Go中的函数

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

如何实现d_包装在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")
    }
}

谢谢@青铜人。但是我认为这个方法只有在我有几个函数的情况下才有效。我手动为每个函数编写一个新函数。但是如果我有很多函数并且我想使用包装器,我需要在包装后不更改函数名。我想在运行时将函数用作键。如果您想更改函数内容但使用相同的函数名,您可以使用全局函数变量,请参阅本文中的代码示例。谢谢。如果gV2很简单的话,它似乎可以工作。但是我只是检查一下我的代码,gV2是一个大约有30行代码的函数,这有点复杂。为每个函数编写gV2并不容易。因此,我认为我仍然需要使用包装器。如果有许多函数具有相同的包装逻辑,那么可以传入原始函数并返回新函数,请参阅本文中的代码示例。