Go net/rpc调用中bool类型返回值无法修改的问题求助
Go net/rpc bool类型字段未更新问题的原因与解决
问题原因
这是Go标准库encoding/gob(net/rpc底层依赖的序列化工具)的特性导致的:
- gob序列化时,默认不会序列化值等于类型零值的字段。
- bool类型的零值是
false,你在客户端给reply.GotIt设了初始值true(非零值),当服务器端把它设为false(零值)时,gob不会传输这个更新后的字段,客户端自然保留原来的true。 - 而int类型的零值是
0,只要字段值和初始值不同,gob就会传输该字段,所以不会出现异常;如果删掉客户端的初始赋值,GotIt默认是false(零值),服务器端的任何赋值都会触发序列化传输,结果就正常了。
解决办法
有两种可行的处理方式:
方式一:移除客户端的初始赋值
让reply.GotIt使用默认的零值false,服务器端的任何赋值(true或false)都会被gob正确序列化并传输到客户端。修改后的客户端代码片段:func CallDone(id int8) { args := DoneArgs{} args.Done = true args.Id = id reply := DoneReply{} // 不再设置reply.GotIt = true ok := call("Coordinator.Inform", &args, &reply) if ok { fmt.Printf(" Task %v complete %v\n", id, reply.GotIt) } else { fmt.Print("Failed\n") } }方式二:给结构体字段添加gob强制序列化标签
在DoneReply结构体的字段上添加gob:"always"标签,强制gob无论字段值是否为零值都序列化该字段:type DoneReply struct { GotIt bool `gob:"always"` }这样不管客户端是否设置初始值,服务器端的修改都会被正确传输到客户端。
内容的提问来源于stack exchange,提问作者multiply
相关产品推荐
相关产品推荐

