测试

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)

}

 

posted on 2015-10-18 19:39  西红柿西瓜  阅读(73)  评论(0)    收藏  举报

导航