是否可以为Go中的任意函数创建一个包装程序,该包装程序将使用相同的参数并返回相同的值?
我不是在说看起来完全一样的包装器,看起来可能有所不同,但是应该可以解决问题。
例如,问题可能是创建一个任意函数的包装,该包装首先在缓存中查找函数调用的结果,并且仅在缓存未命中的情况下执行包装的函数。
答案基于@ joshlf13的想法和答案,但对我来说似乎更简单。 http://play.golang.org/p/v3zdMGfKy9
package main import ( "fmt" "reflect" ) type ( // Type of function being wrapped sumFuncT func(int, int) (int) // Type of the wrapper function wrappedSumFuncT func(sumFuncT, int, int) (int) ) // Wrapper of any function // First element of array is the function being wrapped // Other elements are arguments to the function func genericWrapper(in []reflect.Value) []reflect.Value { // this is the place to do something useful in the wrapper return in[0].Call(in[1:]) } // Creates wrapper function and sets it to the passed pointer to function func createWrapperFunction(function interface {}) { fn := reflect.ValueOf(function).Elem() v := reflect.MakeFunc(reflect.TypeOf(function).Elem(), genericWrapper) fn.Set(v) } func main() { var wrappedSumFunc wrappedSumFuncT createWrapperFunction(&wrappedSumFunc) // The function being wrapped itself sumFunc := func (a int, b int) int { return a + b } result := wrappedSumFunc(sumFunc, 1, 3) fmt.Printf("Result is %v", result) }