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 }