@@ -0,0 +1,76 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user