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) PushBack(v interface{}) { if v == nil { return } q.m.Lock() defer q.m.Unlock() q.l.PushBack(v) } func (q *Queue) Front() *list.Element { q.m.Lock() defer q.m.Unlock() return q.l.Front() } func (q *Queue) Remove(e *list.Element) { if e == nil { return } q.m.Lock() defer q.m.Unlock() q.l.Remove(e) } func (q *Queue) Len() int { q.m.Lock() defer q.m.Unlock() return q.l.Len() }
這樣就基本滿足了.
使用過程中, 發現list有個小坑: 遍歷的時候不能Remove
for e := l.Front(); e != nil; e = e.Next { l.Remove(e) }
按照設想, 這應該會移除list里所有的元素, 但是, 結果是只移除了第一個. 原因是: Remove時候, e.next = nil
, 使得for判斷中, e != nil
不成立了, 所以退出了循環.
這時候有兩種解決辦法:
var next *list.Element for e := l.Front(); e != nil; e = next { next = e.Next() l.Remove(e) }
for { e := l.Front() if e == nil { break } l.Remove(e) }
如果是雙層循環刪除的話, 注意如果第二個循環刪除的元素在第一個刪除的元素后一位, 需要再前進一位:
if j == nexte {
nexte = nexte.Next()
}