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)
}