大家好 我第一次使用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和空串)
请教下大家,我哪里弄错了!
谢谢
有疑问加站长微信联系(非本文作者)