Use the time package's NewTicker to create a channel that sends the current time at regular intervals, then loop over it to execute your job. This approach is idiomatic, requires no external dependencies, and handles timing drift automatically.
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for range ticker.C {
fmt.Println("Running job at:", time.Now())
// Execute your job logic here
}
}