如何使用反射从另一个函数创建一个新函数
How to create a new function from another function using reflection
使用此代码作为模板
package main
import "fmt"
type myStruct struct {
Value int
}
type counter int
func newFuncHandler(fn func(myStruct) error) (interface{}, *counter) {
count := counter(0)
newFn := func(e myStruct) error {
count = count + 1
return fn(e)
}
return newFn, &count
}
func main() {
fn := func(d myStruct) error {
// doing some stuff
return nil
}
handle, c := newFuncHandler(fn)
handleFn := handle.(func(d myStruct) error)
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
fmt.Println(*c) // 5
}
如何修改 newFuncHandler
以便在给定签名未知的函数的情况下,returns 具有相同签名但函数体具有附加代码的函数。 newFuncHandler
不应该知道 myStruct
类型
例如
func newFuncHandler(fn interface{}) (interface{}, *counter) {
count := counter(0)
// some reflection magic
// newFn has the same signature as fn (hardcoded in this case)
newFn := func(e myStruct) error {
// add custom code
count = count + 1
// call the original fn
return fn(e)
}
return newFn, &count
}
使用reflect.MakeFunc to make a function. Use Value.Call调用函数。
func newFuncHandler(v interface{}) (interface{}, *counter) {
count := counter(0)
fn := reflect.ValueOf(v)
newFn := reflect.MakeFunc(fn.Type(), func(args []reflect.Value) (results []reflect.Value) {
count = count + 1
return fn.Call(args)
})
return newFn.Interface(), &count
}
使用此代码作为模板
package main
import "fmt"
type myStruct struct {
Value int
}
type counter int
func newFuncHandler(fn func(myStruct) error) (interface{}, *counter) {
count := counter(0)
newFn := func(e myStruct) error {
count = count + 1
return fn(e)
}
return newFn, &count
}
func main() {
fn := func(d myStruct) error {
// doing some stuff
return nil
}
handle, c := newFuncHandler(fn)
handleFn := handle.(func(d myStruct) error)
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
handleFn(myStruct{Value: 2})
fmt.Println(*c) // 5
}
如何修改 newFuncHandler
以便在给定签名未知的函数的情况下,returns 具有相同签名但函数体具有附加代码的函数。 newFuncHandler
不应该知道 myStruct
类型
例如
func newFuncHandler(fn interface{}) (interface{}, *counter) {
count := counter(0)
// some reflection magic
// newFn has the same signature as fn (hardcoded in this case)
newFn := func(e myStruct) error {
// add custom code
count = count + 1
// call the original fn
return fn(e)
}
return newFn, &count
}
使用reflect.MakeFunc to make a function. Use Value.Call调用函数。
func newFuncHandler(v interface{}) (interface{}, *counter) {
count := counter(0)
fn := reflect.ValueOf(v)
newFn := reflect.MakeFunc(fn.Type(), func(args []reflect.Value) (results []reflect.Value) {
count = count + 1
return fn.Call(args)
})
return newFn.Interface(), &count
}