大家好 我第一次使用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和空串)
請教下大家,我哪里弄錯了!
謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259340.html
標籤:go語言
下一篇:Rtmp 1935 地址如何播放
