We can use time.Sleep to do something in the future. We can do it repeatedly if we used an infinite loop. However, there is a better option which is called time.Ticker. It is designed for such operations. See examples below.


Sleep


package main

import (
"log"
"time"
)

func main() {
done := make(chan struct{})
defer close(done)

run(done)
}

func run(done <-chan struct{}) {
i := 1

for {
// Do something here
log.Println(i, "done")

i++
if i == 4 {
return
}

select {
case <-done:
return
default:
time.Sleep(time.Second)
log.Println("redo")
}
}
}

Ticker


package main

import (
"log"
"time"
)

func main() {
done := make(chan struct{})
defer close(done)

run(done)
}

func run(done <-chan struct{}) {
i := 1

ticker := time.NewTicker(time.Second)
defer ticker.Stop()

for {
// Do something here
log.Println(i, "done")

i++
if i == 4 {
return
}

select {
case <-done:
return
case <-ticker.C:
log.Println("redo")
}
}
}

Result


2020/06/16 21:49:27 1 done
2020/06/16 21:49:28 redo
2020/06/16 21:49:28 2 done
2020/06/16 21:49:29 redo
2020/06/16 21:49:29 3 done