问题:如果结构的字段在 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 编码器不会传输回复 slice 中的第一个元素,因为该元素是零值。解码器不会设置 main 的 reply
slice 中的第一个元素,因为未收到该元素的值。
如果您不想为回复中缺少的值设置默认值,则解码为零值:
...
var reply []Reply
client.Call("RpcObject.GetSlice", 0, &reply)
...
关于go - 使用 gob 解码 rpc 回复时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66067995/