我有一个由某些事件重置的计时器。Go 功能使用范围监听 channel 。如何关闭 channel ,以便for循环退出?
func resetTimer(){
if rf.electionTimer != nil {
rf.electionTimer.Stop()
}
}
rf.electionTimer = time.NewTimer(electionTime)
for _ = range rf.electionTimer.C {
// Do something
}
最佳答案
使用 channel 来通知何时退出环路。
rf.done := make(chan struct{})
rf.electionTimer = time.NewTimer(electionTime)
func stopTimer(){
if rf.electionTimer != nil {
rf.electionTimer.Stop()
close(rf.done)
}
}
循环选择信号 channel 和计时器 channel 。信号 channel 关闭时跳出环路。
loop:
for {
select {
case t := <-rf.electionTimer.C:
// Do something
case <-rf.done:
break loop
}
}
请注意,如果应用程序未在计时器上调用Reset,则在问题或答案中使用循环是没有意义的。如果定时器没有复位,则只有一个值将被发送到定时器的 channel 。
关于go - 如何关闭计时器 channel ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47647333/