我可以在Go中使用反射创建一个新函数吗?

Mat*_*att 11 reflection go

我有一个想法,在Go中使用接口来定义RPC样式接口.所以对于给定的服务,我可能会创建一个这样的接口:

type MyService interface{
  Login(username, password string) (sessionId int, err error)
  HelloWorld(sessionId int) (hi string, err error)
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是使用反射来实现该接口,将方法调用转换为RPC调用,对输入参数进行封送,并将结果解组回到方法的输出中.我知道如果我能得到输入参数的[]接口{},我可以使用反射来进行服务调用.但是,我没有看到任何方法使用反射动态创建一个值,通过调用我的反射使用函数来实现接口.有没有人知道这样做的方法,即使使用不安全?

thw*_*hwd 10

您无法通过反射创建具有附加方法的类型,以实例化该类型的对象.

你可以通过unsafe包装中的很多hackery实现这一点.但即便如此,这也是一次巨大的痛苦.

如果你详细阐述了你想要解决的问题,社区可以提出解决问题的替代方法.

编辑(2015年23月):开始进入1.5有reflect.FuncOfreflect.MakeFunc,它做的正是你想要的.


Mat*_*att 6

似乎反射包将获得在Go 1.1中创建新的任意类型函数的能力:reflect.MakeFunc.

(以下为响应@nemo而添加)

可以创建结构类型而不是接口:

type MyService struct{
  Login func(username, password string) (sessionId int, err error)
  HelloWorld func(sessionId int) (hi string, err error)
}

autorpc.ImplementService(&MyService, MyServiceURL)
session, err := MyService.Login(username, password)
stringout, err := MyService.HelloWorld(session)
Run Code Online (Sandbox Code Playgroud)