gob:未注册接口的类型:fasthbbftv1.BroadcastMessage

gob: type not registered for interface: fasthbbftv1.BroadcastMessage

我的代码组织结构是这样的

package_name/
    server/
        rpc_server.go
    client_test.go
  1. 我注册了一个 RPC 服务器来接收来自其他节点的消息。

type RPCMessageArgs struct {
    Operation string
    Info      Message
}

type Message struct {
    NodeID  uint64
    Payload interface{}
}

func init() {
    gob.Register(BroadcastMessage{})
}

func main() {
    // start rpc server
}

  1. 我使用命令 go run rpc_server.go 在服务器文件夹中启动我的 RPC 服务器。
  2. 我在client_test.go的测试代码如下
package package_name

import (
    "encoding/gob"
    "log"
    "net/rpc"
    "strconv"
    "testing"
)

type BroadcastMessage struct {
    Payload interface{}
}


func TestClient(t *testing.T) {
    gob.Register(BroadcastMessage{})
    args := &RPCMessageArgs{}
    args.Info.NodeID = 3
    args.Info.Payload = &BroadcastMessage{}
    reply := &RPCMessageReply{}
    client, err := rpc.Dial("tcp", ":800"+strconv.Itoa(1))
    if err != nil {
        log.Fatal("dialing: ", err)
    }
    err = client.Call("RPCServer.RemoteCall", args, reply)
    if err != nil {
        log.Fatal("call error: ", err)
    }
}

  1. 我收到这个错误
call error: gob: name not registered for interface: "package_name.BroadcastMessage"

我犯了一个很低级的错误。我在两个文件中定义了两个type BroadcastMessage,一个在rpc_server.go中,一个在client_go.go中。我应该把这些结构定义在一个包里,然后让这两个文件调用这些结构。 改完之后我的代码结构如下:

package_name/
    args/
        rpc_args.go
    server/
        rpc_server.go
    client_test.go

在rpc_args.go文件中定义相关结构,在其他文件中导入args包,然后在rpc_server.goclient_test.go中调用gob.Register()命令到运行正常。