5

我正在尝试通过 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"

关于我做错了什么的任何想法?或者如何注册名字?

4

2 回答 2

4

是的,您已node.Approach在 gob 注册。但后来你通过q了,这不是 node.Approach。而是发送p,因为它具有您注册的类型。

于 2013-03-03T14:59:44.067 回答
1

正如我在邮件列表中回答的那样,您需要在解码端注册类型;在这种情况下,即 RPC 服务器端。gob 编码器使用反射来检查结构和接口,但解码器端必须预先知道接口中可能存储的类型,因为通过线路传输的唯一内容是名称,并且它需要已经看到类型第一的。

于 2013-03-03T20:46:00.557 回答