微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 gob 解码 rpc 回复的错误

如何解决使用 gob 解码 rpc 回复的错误

问题:如果在 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,"localhost:12345") {
        fmt.Println("connecting...")
    }
    reply := []Reply{{225},{9946}}
    client.Call("RpcObject.GetSlice",&reply)
    fmt.Println(reply)
}

输出: [{225} {158}]

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

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。