A high performance timer with minimal goroutines.
- One goroutine runs all
 - Goroutine safe
 - Clean and simple, no third-party deps at all
 - High performance with timing-wheels algorithm
 - Minimal resources use
 - Managed data and handler
 - Customizing channel
 - Well tested
 
package main
import (
	"log"
	"time"
	timer "github.com/singchia/go-timer/v2"
)
func main() {
	t1 := time.Now()
	// new timer
	t := timer.NewTimer()
	// add a tick in 1s
	tick := t.Add(time.Second)
	// wait for it
	<-tick.C()
	// tick fired as time is up, calculate and print the elapse
	log.Printf("time elapsed: %fs\n", time.Now().Sub(t1).Seconds())
}package main
import (
	"log"
	"sync"
	"time"
	timer "github.com/singchia/go-timer/v2"
)
func main() {
	// we need a wait group since using async handler
	wg := sync.WaitGroup{}
	wg.Add(1)
	// new timer
	t := timer.NewTimer()
	// add a tick in 1s with current time and a async handler
	t.Add(time.Second, timer.WithData(time.Now()), timer.WithHandler(func(event *timer.Event) {
		defer wg.Done()
		// tick fired as time is up, calculate and print the elapse
		log.Printf("time elapsed: %fs\n", time.Now().Sub(event.Data.(time.Time)).Seconds())
	}))
	wg.Wait()
}package main
import (
	"log"
	"time"
	timer "github.com/singchia/go-timer/v2"
)
func main() {
	t1 := time.Now()
	// new timer
	t := timer.NewTimer()
	// add cyclical tick in 1s
	tick := t.Add(time.Second, timer.WithCyclically())
	for {
		// wait for it cyclically
		<-tick.C()
		t2 := time.Now()
		// calculate and print the elapse
		log.Printf("time elapsed: %fs\n", t2.Sub(t1).Seconds())
		t1 = t2
	}
}© Austin Zhai, 2015-2025
Released under the Apache License 2.0
