package tools import "time" // Ticker запускает функцию fn с указанным интервалом в отдельной горутине // Возвращает канал для остановки тикера func Ticker(fn func(), interval time.Duration) chan struct{} { if interval <= 0 { interval = time.Second } ticker := time.NewTicker(interval) stopChan := make(chan struct{}) fn() go func() { for { select { case <-ticker.C: fn() case <-stopChan: ticker.Stop() return } } }() return stopChan }