想问一个 go 的技术问题

2020-04-09 11:08:01 +08:00
 arcaitan
在做 6.824 的 lab2A,现在有个问题我搞了几天,一直没找到原因
下面这个方法,
执行的时候打印出了 line1 处的 DPrintf("follower rf %v voted for other!\n", rf.me),
然后就卡住了,永远也打印不出 line2 的("-------------------------------rf %v ----for step %v end!!! \n\n\n", rf.me, i)
有人有思路么?理论上,如果我已经走到了 line1,下一步不就是跳到 switch 语句外面的 line2 了么?

go func() {
i:=0
for {
i++
fmt.Printf("----------------------------------------------------------------rf %v ----for step %v start\n", rf.me, i)
//...
switch state {
case FOLLOWER:
rf.resetElectionTimer()
select{
case <- rf.heartBeatCh:
DPrintf("follower rf %v heartbeat for other!\n", rf.me)
rf.stopElectionTimer()

case <- rf.voteCh:
rf.stopElectionTimer()
DPrintf("follower rf %v voted for other!\n", rf.me) //line1

case <- rf.electionTimer.C:
DPrintf("follower rf %v timeout change to candidate\n", rf.me)
rf.changeState(CANDIDATE, term)
//rf.resetElectionTimer()

}
case CANDIDATE:
//...

}
case LEADER:
//...
}
//line2
fmt.Printf("-------------------------------rf %v ----for step %v end!!! \n\n\n", rf.me, i)
}
}()
2163 次点击
所在节点    问与答
8 条回复
linauror
2020-04-09 11:14:42 +08:00
DPrintf 怎么定义的,是不是打印后就结束程序了?
arcaitan
2020-04-09 11:15:39 +08:00
@linauror 不是,就是个带了开关的 log 打印

// Debugging
const Debug = 1

func DPrintf(format string, a ...interface{}) (n int, err error) {
if Debug > 0 {
log.Printf(format, a...)
}
return
}
zjh31415926
2020-04-09 11:53:41 +08:00
哎,这代码也不好好格式化下,谁愿意琢磨啊
hawken
2020-04-09 12:06:29 +08:00
把代码放到 play.golang.org 里吧
arcaitan
2020-04-09 13:08:45 +08:00
@zjh31415926 不是,格式化好的,但是提交到 v2 之后就变成这样了,也没办法 edit
arcaitan
2020-04-09 13:09:30 +08:00
@hawken 真要跑起来依赖很多其他文件的
Vegetable
2020-04-09 14:23:46 +08:00
题外话, 用 markdown 语法,或者 github gist 都可以
arcaitan
2020-04-09 14:33:06 +08:00
@Vegetable 下次注意

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660713

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX