gob:type未为接口注册: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()命令以正常运行。

最新更新