TimerQueue.go:
package main
import (
"container/heap"
"fmt"
"time"
)
type Timer struct {
Time time.Time
Data interface{}
}
type TimerQueue []*Timer
func (tq TimerQueue) Len() int { return len(tq) }
func (tq TimerQueue) Less(i, j int) bool { return tq[i].Time.Before(tq[j].Time) }
func (tq TimerQueue) Swap(i, j int) { tq[i], tq[j] = tq[j], tq[i] }
func (tq *TimerQueue) Push(x interface{}) {
*tq = append(*tq, x.(*Timer))
}
func (tq *TimerQueue) Pop() interface{} {
old := *tq
n := len(old)
x := old[n-1]
old[n-1] = nil
*tq = old[0 : n-1]
return x
}
func main() {
q := TimerQueue{}
startTime := time.Now()
for i := 0; i < 10; i++ {
heap.Push(&q, &Timer{
Time: startTime.Add(-time.Duration(i) * time.Second),
Data: i,
})
}
for {
if q.Len() == 0 {
break
}
timer := heap.Pop(&q)
fmt.Printf("timer=%+v\n", timer)
}
}
性能待测试。
--end--