В стандартной библиотеке Go есть классный шрифт — Ticker. Тикеры используются, когда вы хотите делать что-то с регулярным интервалом, подобно setInterval в JavaScript. Вот пример:

package main

import (
	"fmt"
	"time"
)

func main() {
	ticker := time.NewTicker(time.Second)
	go func() {
		for range ticker.C {
			fmt.Println("Tick")
		}
	}()

	time.Sleep(time.Second * 4)
	ticker.Stop()
	fmt.Println("Ticker stopped")
}

Согласно документам, тикер — это структура, содержащая канал только для приема объектов time.Time.

type Ticker struct {
    C <-chan Time // The channel on which the ticks are delivered.
}

В примере в начале статьи вы заметите, запустив программу, что первый тик, отправленный по каналу, происходит после истечения первого интервала времени. Таким образом, если вы пытаетесь построить, например, ограничитель скорости, это может быть неудобно, потому что для получения первого немедленного исполнения, казалось бы, ваш лучший вариант:

func doSomethingWithRateLimit() {
	ticker := time.NewTicker(time.Second)
	doSomething()
	for range ticker.C {
		doSomething()
	}
}

На самом деле есть лучший вариант!

На ходу канал также можно перебирать в обычном цикле for, поэтому наше решение состоит в том, чтобы построить цикл for, который автоматически выполняется на первой итерации, а затем ожидает выполнения каждого последующего цикла.

package main

import (
	"fmt"
	"time"
)

func main() {
	ticker := time.NewTicker(time.Minute)
	for ; true; <-ticker.C {
		fmt.Println("hi")
	}
}

Надеюсь, это поможет избежать избыточного кода в ваших проектах!

Спасибо за чтение

Напишите мне в твиттере @wagslane, если у вас есть какие-либо вопросы или комментарии.

Следите за мной на Dev.to: wagslane

Пост Range Over Ticker In Go With Immediate First Tick впервые появился на Qvault.