测试
package main import ( "errors" "fmt" "sync" "time" ) type Element struct { V int Pre *Element Next *Element } type List struct { Len int Head *Element Tail *Element m sync.RWMutex } func (l *List) Push(v int) { l.m.Lock() defer l.m.Unlock() e := &Element{V: v} if l.Head == nil { l.Head = e } else { l.Tail.Next = e e.Pre = l.Tail } l.Tail = e l.Len = l.Len + 1 } var errEmpty = errors.New("空了!") func (l *List) Pop() (v int, err error) { l.m.Lock() defer l.m.Unlock() if l.Tail == nil { err = errEmpty } else { v = l.Tail.V l.Tail = l.Tail.Pre if l.Tail == nil { l.Head = nil } l.Len = l.Len - 1 } return v, err } func main() { list := new(List) /* for i := 0; i < 10; i++ { list.Push(i) } */ go list.Push(1) go list.Push(2) go list.Push(3) go list.Push(4) go list.Push(5) time.Sleep(time.Second * 2) fmt.Println("qian:", list) for v, err := list.Pop(); err == nil; v, err = list.Pop() { fmt.Printf("%v\n", v) } fmt.Println("hou:", list) }