47 lines
633 B
Go
47 lines
633 B
Go
package container
|
|
|
|
import (
|
|
"container/list"
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
type Queue struct {
|
|
sync.Mutex
|
|
data *list.List
|
|
}
|
|
|
|
func NewQueue() *Queue {
|
|
q := new(Queue)
|
|
q.data = list.New()
|
|
return q
|
|
}
|
|
|
|
func (q *Queue) Len() int {
|
|
return q.data.Len()
|
|
}
|
|
|
|
func (q *Queue) Push(v interface{}) {
|
|
defer q.Unlock()
|
|
q.Lock()
|
|
q.data.PushFront(v)
|
|
}
|
|
|
|
func (q *Queue) Pop() interface{} {
|
|
defer q.Unlock()
|
|
q.Lock()
|
|
iter := q.data.Back()
|
|
if iter == nil {
|
|
return nil
|
|
}
|
|
v := iter.Value
|
|
q.data.Remove(iter)
|
|
return v
|
|
}
|
|
|
|
func (q *Queue) Dump() {
|
|
for iter := q.data.Back(); iter != nil; iter = iter.Prev() {
|
|
fmt.Println("item:", iter.Value)
|
|
}
|
|
}
|