feat: reflects 包新增 FuncWrapper 相关函数
This commit is contained in:
parent
bdbcc1bb35
commit
5a898f58dc
|
@ -0,0 +1,48 @@
|
|||
package reflects
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// WrapperFunc 包装函数
|
||||
func WrapperFunc[Func any](f any, wrapper func(call func([]reflect.Value) []reflect.Value) func(args []reflect.Value) []reflect.Value) (wf Func, err error) {
|
||||
tof := reflect.TypeOf(f)
|
||||
if tof.Kind() != reflect.Func {
|
||||
return wf, fmt.Errorf("f is not a function, got %v", tof.String())
|
||||
}
|
||||
return reflect.MakeFunc(tof, wrapper(func(args []reflect.Value) []reflect.Value {
|
||||
return reflect.ValueOf(f).Call(args)
|
||||
})).Interface().(Func), nil
|
||||
}
|
||||
|
||||
// WrapperFuncBefore2After 包装函数,前置函数执行前,后置函数执行后
|
||||
func WrapperFuncBefore2After[Func any](f Func, before, after func()) (wf Func, err error) {
|
||||
vof := reflect.ValueOf(f)
|
||||
tof := vof.Type()
|
||||
if tof.Kind() != reflect.Func {
|
||||
return wf, fmt.Errorf("f is not a function, got %v", tof.String())
|
||||
}
|
||||
wrapped := reflect.MakeFunc(tof, func(args []reflect.Value) []reflect.Value {
|
||||
if before != nil {
|
||||
before()
|
||||
}
|
||||
result := vof.Call(args)
|
||||
if after != nil {
|
||||
after()
|
||||
}
|
||||
return result
|
||||
})
|
||||
|
||||
return wrapped.Interface().(Func), nil
|
||||
}
|
||||
|
||||
// WrapperFuncBefore 包装函数,前置函数执行前
|
||||
func WrapperFuncBefore[Func any](f Func, before func()) (wf Func, err error) {
|
||||
return WrapperFuncBefore2After(f, before, nil)
|
||||
}
|
||||
|
||||
// WrapperFuncAfter 包装函数,后置函数执行后
|
||||
func WrapperFuncAfter[Func any](f Func, after func()) (wf Func, err error) {
|
||||
return WrapperFuncBefore2After(f, nil, after)
|
||||
}
|
Loading…
Reference in New Issue