github.com/chenjiandongx/go-queue@v0.0.0-20191023082232-e2a36f382f84/lifo_queue.go (about) 1 package collections 2 3 import ( 4 "container/list" 5 "sync" 6 ) 7 8 type LifoQueue struct { 9 data *list.List 10 mut *sync.RWMutex 11 } 12 13 func NewLifoQueue() *LifoQueue { 14 return &LifoQueue{data: list.New(), mut: new(sync.RWMutex)} 15 } 16 17 func (q *LifoQueue) Put(v interface{}) { 18 defer q.mut.Unlock() 19 q.mut.Lock() 20 q.data.PushFront(v) 21 } 22 23 func (q *LifoQueue) Get() (interface{}, bool) { 24 defer q.mut.Unlock() 25 q.mut.Lock() 26 if q.data.Len() > 0 { 27 iter := q.data.Front() 28 v := iter.Value 29 q.data.Remove(iter) 30 return v, true 31 } 32 return nil, false 33 } 34 35 func (q *LifoQueue) Qsize() int { 36 defer q.mut.RUnlock() 37 q.mut.RLock() 38 return q.data.Len() 39 } 40 41 func (q *LifoQueue) IsEmpty() bool { 42 defer q.mut.RUnlock() 43 q.mut.RLock() 44 return !(q.data.Len() > 0) 45 }