登录
首页 >  Golang >  Go问答

出现解码 RPC 回复时的 gob 错误

来源:stackoverflow

时间:2024-02-23 18:45:23 231浏览 收藏

你在学习Golang相关的知识吗?本文《出现解码 RPC 回复时的 gob 错误》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

问题:如果结构的字段在 rpc 调用后为零,则不会用新值替换。 这是最小的代码示例:

package main

import (
    "fmt"
    "log"
    "net"
    "net/rpc"
)

type RpcObject int
type Reply struct {
    A int
}

func (*RpcObject) GetSlice(req int, reply *[]Reply) error {
    *reply = []Reply{{0}, {158}}
    return nil
}

func Serve() {
    addr, err := net.ResolveTCPAddr("tcp", "0.0.0.0:12345")
    if err != nil {
        log.Fatal(err)
    }
    inbound, err := net.ListenTCP("tcp", addr)
    if err != nil {
        log.Fatal(err)
    }
    handler := new(RpcObject)
    rpc.Register(handler)
    rpc.Accept(inbound)
}
func main() {
    go Serve()
    var err error
    var client *rpc.Client
    for client, err = rpc.Dial("tcp", "localhost:12345"); err != nil; client, err = rpc.Dial("tcp", "localhost:12345") {
        fmt.Println("connecting...")
    }
    reply := []Reply{{225}, {9946}}
    client.Call("RpcObject.GetSlice", 0, &reply)
    fmt.Println(reply)
}

输出: [{225} {158}]

我认为这是 gob 格式的问题,但我不确定。有人知道如何解决这个问题吗?


解决方案


应用程序产生了预期的结果。 gob 编码器不会传输回复切片中的第一个元素,因为该元素是零值。解码器不会设置 main 的 reply 切片中的第一个元素,因为未收到该元素的值。

如果您不想为回复中缺少的值设置默认值,则解码为零值:

...
var reply []Reply
client.Call("RpcObject.GetSlice", 0, &reply)
...

好了,本文到此结束,带大家了解了《出现解码 RPC 回复时的 gob 错误》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>