github.com/turingchain2020/turingchain@v1.1.21/common/listmap/listmap.go (about) 1 package listmap 2 3 import ( 4 "container/list" 5 6 "github.com/turingchain2020/turingchain/types" 7 ) 8 9 //ListMap list 和 map 组合的一个数据结构体 10 type ListMap struct { 11 m map[string]*list.Element 12 l *list.List 13 } 14 15 //New 创建一个新的数据结构 16 func New() *ListMap { 17 return &ListMap{ 18 m: make(map[string]*list.Element), 19 l: list.New(), 20 } 21 } 22 23 //Size 结构中的item 数目 24 func (lm *ListMap) Size() int { 25 return len(lm.m) 26 } 27 28 //Exist 是否存在这个元素 29 func (lm *ListMap) Exist(key string) bool { 30 _, ok := lm.m[key] 31 return ok 32 } 33 34 //GetItem 通过key 获取这个 item 35 func (lm *ListMap) GetItem(key string) (interface{}, error) { 36 item, ok := lm.m[key] 37 if !ok { 38 return nil, types.ErrNotFound 39 } 40 return item.Value, nil 41 } 42 43 //Push 在队伍尾部插入 44 func (lm *ListMap) Push(key string, value interface{}) { 45 if elm, ok := lm.m[key]; ok { 46 elm.Value = value 47 return 48 } 49 elm := lm.l.PushBack(value) 50 lm.m[key] = elm 51 } 52 53 //GetTop 获取队列头部的数据 54 func (lm *ListMap) GetTop() interface{} { 55 elm := lm.l.Front() 56 if elm == nil { 57 return nil 58 } 59 return elm.Value 60 } 61 62 //Remove 删除某个key 63 func (lm *ListMap) Remove(key string) interface{} { 64 if elm, ok := lm.m[key]; ok { 65 value := lm.l.Remove(elm) 66 delete(lm.m, key) 67 return value 68 } 69 return nil 70 } 71 72 //Walk 遍历整个结构,如果cb 返回false 那么停止遍历 73 func (lm *ListMap) Walk(cb func(value interface{}) bool) { 74 for e := lm.l.Front(); e != nil; e = e.Next() { 75 if cb == nil { 76 return 77 } 78 if !cb(e.Value) { 79 return 80 } 81 } 82 }