我有一个主意,用接口围棋定义RPC风格的接口。 因此,对于一个给定的服务,我可能会创建这样的界面:
type MyService interface{
Login(username, password string) (sessionId int, err error)
HelloWorld(sessionId int) (hi string, err error)
}
我想这样做的是使用反射来实现该接口,翻译方法调用到RPC调用,封送输入参数,并拆封结果返回到方法的输出。 我知道,如果我能得到的输入参数的[]接口{}我可以使用反射,使服务调用。 不过,我没有看到任何方式使用反射来动态地创建,将通过调用我使用反射功能实现该接口的值。 有谁知道的方式做到这一点,即使使用不安全?
不能创建与通过反射连接方法的类型时,以实例化类型的一个对象。
你可能有过很多两轮牛车的实现这个unsafe
包。 但即便如此,它会是一个巨大的痛苦。
如果您阐述更多关于你正在试图解决这个问题,社会上能想出解决它的替代方式。
编辑(2015 23日):开始进入1.5有reflect.FuncOf
和reflect.MakeFunc
,它做的正是你想要的。
看来,反映包将获得进入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)
我想这可能是可能实现你想要什么,如果能全面落实reflect.Type
界面,你不能(不导出方法)。 然后,它可能,也许,可以用实例化自定义类型unsafe_New
。
总而言之,这是不是一个好主意,这样做。
你想要什么下一个最好的事情可能是使用类似采空区 。 您可以使用采空区的中间语言,使用反射读你的接口中的方法,把它们写为采空区和采空区创建代码进行解码,以真正转到对象。 但我不知道这是值得的。
你们中的大多数是通过手动实现你在客户端界面和转发方法调用安全的时间。
由于语言的静态特性,也没有办法实现,在这个时间点动态围棋的接口。
我知道你想要什么,实现还有其他的方案,这也将有利于更高级的反射能力(例如,单元测试一个很好的模拟框架)
这就是说,还有就是你能解决这个问题的方法。 你可以写你自己的工具,它生成包含一个接口给定的RPC实现围棋源代码文件。
你将不得不使用AST库,以及其他,解析和处理的源接口。
在经历了这条道路( gostub工具,可以作为参考使用),我可以说这是不是所有的乐趣和轻松。 不过,最终的结果是可以忍受的,因为围棋提供了go:generate
功能,这至少使得重新运行该工具,一旦接口发生了变化,一点点更容易。