我正在尝试通过RPC发送一个具体的实现。 RPC方法需要一个接口。
相关的代码段是:
在包node
中:
type Commander interface {
Action() string
}
type Approach struct {
Position int
}
func (p Approach) Action() string {
return "Approach"
}
func (t *RPCMethod) RPCAction(command Commander, reply *int) error {
// RPC Method
}
在包main
中:
import "node"
gob.Register(node.Approach{})
var p = node.Approach{position}
var q node.Commander = p
var reply int
err = client.Call("RPCMethod.RPCAction",&q, &reply)
我已经使用gob注册了node.Approach。但是在运行主要程序时我正在接收
gob: name not registered for interface: "node.Approach"
关于我做错的任何想法?或者如何注册名称?
答案 0 :(得分:3)
是的,你已经注册了node.Approach
gob。但是,您传递了q
,不是 node.Approach
。请改为发送p
,因为它具有您已注册的类型。
答案 1 :(得分:1)
正如我在邮件列表中回答的那样,您需要在解码端注册类型;在这种情况下,这是RPC服务器端。 gob编码器使用反射来检查结构和接口,但解码器端必须事先知道接口内可能存储的类型,因为通过线路传输的唯一内容是名称,并且它需要已经看到类型第一