RPC 传结构体,部分值丢失

Taya666 · · 2151 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

大家好 我第一次使用go。写了个rpc程序 但是在我使用rpc 进行传参的时候出了点问题,然后参数是个结构体,在服务器给reply赋值的时候都是正确的,然后客服端收到的参数确只有部分是正确的,然后有部分的值是初始值。 下面是我的部分代码 ``` type StateEnum uint8 const ( IDLE StateEnum = iota INPROGRESS COMPLETED ERROR ) type PhaseEnum uint8 const ( MAP_PAHSE PhaseEnum = iota REDUCE_PAHSE ) type Task struct{ state StateEnum phase PhaseEnum NMap int NReduce int fileName string workID int } ``` 然后在服务器端是这样的 ``` func (c *Coordinator) ReqOneTask(args *ReqTaskArgs, reply *ReqTaskReply) error { c.mtx.Lock() defer c.mtx.Unlock() t, ok := <- c.taskCh if ok { t.workID = args.WorkerID t.NMap = c.workerNum t.state = INPROGRESS c.taskStates[t.workID] = t reply.Task = t reply.State = 0 fmt.Printf("ReqOneTask %+v\n",t) }else{ if c.phase == MAP_PAHSE{ reply.State = 1 }else{ reply.State = -1 } } return nil } ``` 我看fmt.Printf("ReqOneTask %+v\n",t) 的输出是正常的结果,t的state,fileName 都是预期的值 然后客服端是这样的 ``` func (w *worker) getTask(){ args := &ReqTaskArgs{} args.WorkerID = w.id reply := &ReqTaskReply{} if ok := call("Coordinator.ReqOneTask", args, reply); !ok { log.Fatal("getTask fail") } switch reply.State{ case 0: w.runTask(reply.Task) case 1: case -1: os.Exit(1) } } ``` 在客户端这边看的 reply.Task ,其中里面的workID,NMap的值是正确的,但是state 和 fileName是初始化值(0和空串) 请教下大家,我哪里弄错了! 谢谢

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2151 次点击  
加入收藏 微博
2 回复  |  直到 2021-03-17 15:28:35
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传