В Golang есть таймеры и тикеры, которые как раз-таки и позволяют выполнять код в будущем, один или несколько раз. Если ты хочешь сделать так, чтобы твоя программа делала какое-то действие при наступлении определённого времени, то это твой выбор.
time.After ожидает указанную продолжительность и затем отправляет текущее время по возвращаемому каналу:
select {
case news := <-AFP:
fmt.Println(news)
case <-time.After(time.Hour):
fmt.Println("No news in an hour.")
}
Подлежащий time.Timer не будет восстановлен сборщиком мусора, пока не сработает таймер. Если это проблема, используйте взамен time.NewTimer и вызовите его метод Stop, когда таймер больше не нужен:
for alive := true; alive; {
timer := time.NewTimer(time.Hour)
select {
case news := <-AFP:
timer.Stop()
fmt.Println(news)
case <-timer.C:
alive = false
fmt.Println("No news in an hour. Service aborting.")
}
}
ime.Tick возвращает канал, который доставляет такты (ticks) с одинаковыми интервалами:
go func() {
for now := range time.Tick(time.Minute) {
fmt.Println(now, statusUpdate())
}
}()
Подлежащий time.Ticker не будет восстановлен сборщиком мусора. Если это проблема, используйте взамен time.NewTicker и вызовите его метод Stop, когда тикер больше не нужен.
time.AfterFunc ждет в течение указанной продолжительности и затем вызывает функцию в своей собственной goroutine. Возвращает time.Timer, который можно использовать для отмены вызова:
func Foo() {
timer = time.AfterFunc(time.Minute, func() {
log.Println("Foo выполняется более минуты.")
})
defer timer.Stop()
// Выполняем какую-либо работу
}
Спасибо за помощь. Накидали много разных возможностей использования таймаутов, таймтиков и тайм афтер. Буду сейчас смотреть, что с этим всем можно сделать.