12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package util
- import "sync"
- type node struct {
- data interface{}
- next *node
- }
- type Queue struct {
- head *node
- tail *node
- count int
- sync.RWMutex
- }
- func NewQueue() *Queue {
- q := &Queue{}
- return q
- }
- func (q *Queue) Len() int {
- q.RLock()
- defer q.RUnlock()
- return q.count
- }
- func (q *Queue) Enqueue(item interface{}) {
- q.Lock()
- defer q.Unlock()
- n := &node{data: item}
- if q.tail == nil {
- q.tail = n
- q.head = n
- } else {
- q.tail.next = n
- q.tail = n
- }
- q.count++
- }
- func (q *Queue) Dequeue() interface{} {
- q.Lock()
- defer q.Unlock()
- if q.head == nil {
- return nil
- }
- n := q.head
- q.head = n.next
- if q.head == nil {
- q.tail = nil
- }
- q.count--
- return n.data
- }
|