我有一个由某些事件重置的计时器。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/

10-14 07:28