Go问答 reflect MakeFunc这个函数具体怎么用

haohongfan · 2017年06月07日 · 最后由 lys86_1205 回复于 2017年07月27日 · 826 次阅读

MakeFunc(typ Type, fn func(args [] Value) (results [] Value)) Value

谁能给个简单的例子, 并解释一下

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

这个 函数 可以用来实现 Proxy, 写 RPC 的神器. 因为 Go 的机制问题, 这个 函数 需要一个 函数原型 typ 作为输入参数, 而这个 原型 不能 动态 构建, 也失去了部分灵活性.

  • 这是 go 标准库中实现 RPC 服务器端本地调用的一段代码
func (s *service) call(server *Server, sending *sync.Mutex, mtype *methodType, req *Request, argv, replyv reflect.Value, codec ServerCodec) {
    mtype.Lock()
    mtype.numCalls++
    mtype.Unlock()
    function := mtype.method.Func
    // Invoke the method, providing a new value for the reply.
    returnValues := function.Call([]reflect.Value{s.rcvr, argv, replyv})
    // The return value for the method is an error.
    errInter := returnValues[0].Interface()
    errmsg := ""
    if errInter != nil {
        errmsg = errInter.(error).Error()
    }
    server.sendResponse(sending, req, replyv.Interface(), codec, errmsg)
    server.freeRequest(req)
  }

其中 mtype.method 的 method 类型为 reflect.Method 运行了反射机制。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册