我需要创建一个包装内部函数的函数,并且与内部函数具有完全相同的签名。我担心这是不可能的,因为 Go 不支持泛型,但也许可以使用reflect
? 以下是我想要的伪围棋:
func myFunc(a int, b string) (string, error) {
return string(a) + b, nil
}
func wrapInner(inner interface{}) interface{} {
argTypes := argsOf(inner)
returnTypes := returnsOf(inner)
wrapper := func(args argTypes) returnTypes {
// do something with inner's args
modArgs := doSomething(args)
ret := inner(modArgs)
// do something with the return
modRet := doSomething(ret)
}
return wrapper
}
wrapped := wrapInner(myFunc)
val, err := wrapped(1, "b")
伪代码充满了错误,但想法是wrapInner
对inner
. 但是,它能够检查签名(可能使用reflect
?)并创建一个向内部添加逻辑并具有与内部完全相同的签名的函数。这可能吗?