77 lines
1.6 KiB
Go
77 lines
1.6 KiB
Go
package cachev2
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"reflect"
|
|
"runtime"
|
|
)
|
|
|
|
// funcInvoke 函数调用
|
|
func funcInvoke(fun interface{}, args ...interface{}) (data interface{}, err error) {
|
|
ft := reflect.TypeOf(fun)
|
|
fv := reflect.ValueOf(fun)
|
|
if ft.Kind() != reflect.Func {
|
|
return nil, fmt.Errorf("CACHE:不是一个有效的函数")
|
|
}
|
|
funcArgsNum := ft.NumIn()
|
|
if len(args) != funcArgsNum {
|
|
return nil, fmt.Errorf("CACHE:参数未对齐错误,方法名:%s,方法参数数:%d,传入参数数:%d", runtime.FuncForPC(fv.Pointer()).Name(), funcArgsNum, len(args))
|
|
}
|
|
funcResNum := ft.NumOut()
|
|
if funcResNum < 1 {
|
|
return nil, fmt.Errorf("CACHE:没有返回值的无效调用,方法名:%s", runtime.FuncForPC(fv.Pointer()).Name())
|
|
}
|
|
|
|
// 调用函数
|
|
var funRes []reflect.Value
|
|
if funcArgsNum == 0 {
|
|
funRes = fv.Call(nil)
|
|
} else {
|
|
argsV := make([]reflect.Value, 0, len(args))
|
|
for _, arg := range args {
|
|
argsV = append(argsV, reflect.ValueOf(arg))
|
|
}
|
|
|
|
funRes = fv.Call(argsV)
|
|
}
|
|
|
|
data = funRes[0].Interface()
|
|
for _, ret := range funRes {
|
|
if ret.Type().String() == "error" {
|
|
e, ok := ret.Interface().(error)
|
|
if ok {
|
|
err = e
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// serialJson 序列化为JSON
|
|
func serialJson(m interface{}) (string, error) {
|
|
b, err := json.Marshal(m)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return string(b), nil
|
|
}
|
|
|
|
// unSerialJson 从JSON字符串反序列化
|
|
func unSerialJson(str string, resObj interface{}) (m interface{}, err error) {
|
|
if resObj == nil {
|
|
err = json.Unmarshal([]byte(str), &m)
|
|
} else {
|
|
err = json.Unmarshal([]byte(str), &resObj)
|
|
m = resObj
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return
|
|
}
|