我有一个想法,在Go中使用接口来定义RPC样式接口。因此,对于给定的服务,我可能会创建一个这样的界面:
type MyService interface{
Login(username, password string) (sessionId int, err error)
HelloWorld(sessionId int) (hi string, err error)
}
我想要做的是使用反射来实现该接口,将方法调用转换为RPC调用,对输入参数进行编组,并将结果解组回到方法的输出中。我知道如果我能得到输入参数的[]接口{},我可以使用反射来进行服务调用。但是,我没有看到任何方法使用反射动态创建一个值,通过调用我的反射使用函数来实现接口。有没有人知道这样做的方法,即使使用不安全的?
答案 0 :(得分:10)
您无法通过反射创建具有附加方法的类型,以实例化该类型的对象。
你可以通过unsafe
包来解决这个问题。但即便如此,这也是一次巨大的痛苦。
如果你详细阐述了你试图解决的问题,社区可以提出解决问题的替代方法。
编辑(2015年7月23日):从Go 1.5开始,有reflect.FuncOf
和reflect.MakeFunc
,这正是您想要的。
答案 1 :(得分: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)
答案 2 :(得分:0)
我认为如果可以完全实现reflect.Type
接口,你可能无法实现你想要的东西,你不能(未导出的方法)。然后,也许可以使用unsafe_New
来实例化您的自定义类型。
总而言之,这样做不是一个好主意。
你想要的下一个最好的事情可能是使用像gob这样的东西。您可以使用gob作为中间语言,使用反射从界面读取方法,将它们写为gob并将创建的gob代码解码为真正的Go对象。但我不确定这是否值得。
大多数情况下,通过在客户端手动实现界面,您会更安全 并转发方法调用。
答案 3 :(得分:0)