口径:未注册接口的类型:快速浏览 ftv1。广播消息

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


package_name/

    server/

        rpc_server.go

    client_test.go

我注册一个 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

}


我使用命令 启动服务器文件夹中的 RPC 服务器。go run rpc_server.go

我在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)

    }

}


我收到此错误

call error: gob: name not registered for interface: "package_name.BroadcastMessage"


烙印99
浏览 54回答 1
1回答

HUWWW

我犯了一个非常低级的错误。我在两个文件中定义了两个,一个在 中,一个在 .我应该在包中定义这些结构,然后让这两个文件调用这些结构。更改后,我的代码结构如下:type BroadcastMessagerpc_server.goclient_go.gopackage_name/    args/        rpc_args.go    server/        rpc_server.go    client_test.go在 rpc_args.go 文件中定义相关结构,将 args 包导入其他文件中,然后调用命令 in 并正常运行。gob.Register()rpc_server.goclient_test.go
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go