Golang中国
问题的由来RPC

//服务端设置
type TestServer struct{
}
func (t *TestServer) Foo (data map[string]interface{})string{
    //do thing...
}
func (t *TestServer) Bar (data map[string]interface{})string{
    //do thing...
}
var test *TestServer
srv.AddAllMethods(test) //srv type is *rpc.TCPServer

//客户端调用
type Test struct{
   ?? func(map[string]interface{}) string
}
var test *Test
client := rpc.NewClient("ip")
client.UseService(&test)

test . ?? ( data ) //data type is map

?? 可能是Foo或者Bar,根据前端传递字符而定,如何动态生成这样的结构体字段并调用?

fanyang 于 2016-12-24 16:33 修改
1 回复
fanyang
#1 fanyang • 2016-12-24 16:35

解决方案

//服务端设置
type TestServer struct{
    Name string
    Data map[string]interface{}
}
func (t *TestServer) Foo (data map[string]interface{})string{
    //do thing...
}
func (t *TestServer) Bar (data map[string]interface{})string{
    //do thing...
}
func Run(data []byte)string{
    ts := new(TestServer)
    err := json.Unmarshal(data, ts)
    if err != nil {
        return "数据类型不正确: " + err.Error()
    }

    fun := reflect.ValueOf(ts).MethodByName(strings.Title(ts.Name))
    if !fun.IsValid() {
        return "服务不存在: " + ts.Name
    }
    param := make([]reflect.Value, 1)
    param[0] = reflect.ValueOf(ts.Data)

    return fun.Call(param)[0].String()
}
srv := rpc.NewTCPServer("ip")//hprose rpc
srv.AddFunction("Run", Run)


//客户端调用
type Test struct{
   Run func([]byte) string
}
var test *Test
client := rpc.NewClient("ip")
client.UseService(&test)

test.Run( data ) //data is json: {"name":"Foo","data": ... }
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。