我正在尝试在 Go 中创建一个轮询器,它会旋转并每 24 小时执行一次函数。
我还希望能够停止轮询,我试图通过拥有一个完成的通道并传递一个空结构来停止 for 循环来做到这一点。
在我的测试中,for 只是无限循环,我似乎无法停止它,我是否错误地使用了 done 通道?股票行情按预期工作。
Poller struct {
HandlerFunc HandlerFunc
interval *time.Ticker
done chan struct{}
}
func (p *Poller) Start() error {
for {
select {
case <-p.interval.C:
err := p.HandlerFunc()
if err != nil {
return err
}
case <-p.done:
return nil
}
}
}
func (p *Poller) Stop() {
p.done <- struct{}{}
}
这是执行代码并导致无限循环的测试。
poller := poller.NewPoller(
testHandlerFunc,
time.NewTicker(1*time.Millisecond),
)
err := poller.Start()
assert.Error(t, err)
poller.Stop()