Прокаченный таймер на Go

У языка Go шикарная стандартная библиотека, инструменты на все случаи жизни, при этом достаточно лаконичные. Например, рассмотрим отличный пакет time. За всё время работы с Go, мне всего лишь дважды приходилось расширять его возможности.

Первый раз, около года назад, понадобилось строковое представление времени и периодов на русском языке, что привело к созданию пакета russian-time. Он не очень красивый, создан на скорую руку, потому не буду на нём останавливаться.

Второй инструмент мне кажется более интересным. Предпосылкой к созданию этого небольшого пакета, была необходимость контроля времени выполнения скриптов во встроенном интерпретаторе JavaScript Google V8. Так уж повелось, что JavaScript, как правило, характеризуется асинхронным поведением, что несколько затрудняло выполнение поставленной задачи. Одним из компонентов решения должен был стать таймер, который можно приостанавливать на неопределённое время, а после запускать снова с момента остановки. Так появился timer.

Функции AfterFunc и NewTimer очень похожи на стандартные, но у возвращаемого указателя на структуру Timer есть два новых метода:

Pause приостанавливает выполнение таймера, а Start, соответственно, запускает его с момента остановки, либо после инициализации. Т.е. после создания таймера, запускать его требуется вручную.

Пример из теста лучше покажет идею:

var now = time.Now()

// Создаем таймер на 1 секунду
var timer = AfterFunc(time.Second, func() {

    // Сравниваем сколько прошло времени
	if time.Now().Sub(now) < time.Second*2 {
		panic("Early func")
	}
})

// Запускаем таймер
timer.Start()

// Через полсекунды приостанавливаем
time.Sleep(time.Microsecond * 500)
timer.Pause()

// Через секунду запускаем снова
time.Sleep(time.Second)
timer.Start()
time.Sleep(time.Second)

GoDoc