package cron import "time" type Cron struct { d time.Duration ch chan struct{} } func NewCron(d time.Duration) *Cron { return &Cron{ d: d, ch: make(chan struct{}), } } func (c *Cron) Do(f func()) { go func() { ticker := time.NewTicker(c.d) defer ticker.Stop() for { select { case <-ticker.C: f() case <-c.ch: return } } }() } func (c *Cron) Stop() { select { case _, _ = <-c.ch: default: c.ch <- struct{}{} close(c.ch) } }