一尘不染

Go中任意功能的包装器

go

是否可以为Go中的任意函数创建一个包装程序,该包装程序将使用相同的参数并返回相同的值?

我不是在说看起来完全一样的包装器,看起来可能有所不同,但是应该可以解决问题。

例如,问题可能是创建一个任意函数的包装,该包装首先在缓存中查找函数调用的结果,并且仅在缓存未命中的情况下执行包装的函数。


阅读 233

收藏
2020-07-02

共1个答案

一尘不染

答案基于@ 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)
}
2020-07-02