mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-09-21 18:56:39 +08:00
64 lines
802 B
Go
64 lines
802 B
Go
package queue
|
|
|
|
import (
|
|
"container/list"
|
|
"sync"
|
|
)
|
|
|
|
type Queue struct {
|
|
l *list.List
|
|
m sync.Mutex
|
|
}
|
|
|
|
func NewQueue() *Queue {
|
|
return &Queue{l: list.New()}
|
|
}
|
|
|
|
func (q *Queue) LPush(v interface{}) {
|
|
if v == nil {
|
|
return
|
|
}
|
|
q.m.Lock()
|
|
defer q.m.Unlock()
|
|
q.l.PushFront(v)
|
|
}
|
|
|
|
func (q *Queue) RPush(v interface{}) {
|
|
if v == nil {
|
|
return
|
|
}
|
|
q.m.Lock()
|
|
defer q.m.Unlock()
|
|
q.l.PushBack(v)
|
|
}
|
|
|
|
func (q *Queue) LPop() interface{} {
|
|
q.m.Lock()
|
|
defer q.m.Unlock()
|
|
|
|
element := q.l.Front()
|
|
if element == nil {
|
|
return nil
|
|
}
|
|
|
|
q.l.Remove(element)
|
|
return element.Value
|
|
}
|
|
|
|
func (q *Queue) RPop() interface{} {
|
|
q.m.Lock()
|
|
defer q.m.Unlock()
|
|
|
|
element := q.l.Back()
|
|
if element == nil {
|
|
return nil
|
|
}
|
|
|
|
q.l.Remove(element)
|
|
return element.Value
|
|
}
|
|
|
|
func (q *Queue) Len() int {
|
|
return q.l.Len()
|
|
}
|