package rpc import ( "errors" "fmt" "reflect" ) type MethodInvoker struct { call func([]reflect.Value) []reflect.Value parameterParsers []ValueParser } func NewMethodInvoker(call func([]reflect.Value) []reflect.Value, parameterParsers []ValueParser) *MethodInvoker { return &MethodInvoker{call, parameterParsers} } func (invoker *MethodInvoker) parseParameters(jsonArray []interface{}) ([]reflect.Value, error) { parsers := invoker.parameterParsers count := len(parsers) if len(jsonArray) != count { return nil, errors.New(fmt.Sprintf("参数长度错误!")) } else { parameterValues := make([]reflect.Value, count) for i, parser := range parsers { if parameter, err := parser(jsonArray[i], fmt.Sprintf("#%d", i+1)); err != nil { return nil, err } else { parameterValues[i] = reflect.ValueOf(parameter) } } return parameterValues, nil } } func (invoker *MethodInvoker) Process(jsonArray []interface{}) (interface{}, error) { if parameterValues, err := invoker.parseParameters(jsonArray); err != nil { return nil, err } else { returnValues := invoker.call(parameterValues) var err interface{} var result interface{} if len(returnValues) > 1 { err = returnValues[1].Interface() result = returnValues[0].Interface() } else { err = returnValues[0].Interface() result = nil } if err != nil { return nil, err.(error) } else { return result, nil } } }