gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/setx/setx.go (about) 1 package setx 2 3 import "sync" 4 5 type SetObject[K comparable, V any] struct { 6 mutex sync.RWMutex 7 data map[K]V 8 } 9 10 func New[K comparable, V any]() *SetObject[K, V] { 11 return &SetObject[K, V]{ 12 data: map[K]V{}, 13 } 14 } 15 func (set *SetObject[K, V]) Reset(data map[K]V) { 16 set.mutex.Lock() 17 set.data = data 18 set.mutex.Unlock() 19 } 20 func (set *SetObject[K, V]) Set(key K, value V) { 21 set.mutex.Lock() 22 set.data[key] = value 23 set.mutex.Unlock() 24 } 25 func (set *SetObject[K, V]) SetByMap(m map[K]V) { 26 data := set.data 27 set.mutex.Lock() 28 for key, value := range m { 29 data[key] = value 30 } 31 set.mutex.Unlock() 32 } 33 34 func (set *SetObject[K, V]) SetBySet(other *SetObject[K, V]) { 35 data := set.data 36 set.mutex.Lock() 37 for key, value := range other.data { 38 data[key] = value 39 } 40 set.mutex.Unlock() 41 } 42 43 func (set *SetObject[K, V]) Get(key K) (V, bool) { 44 set.mutex.RLock() 45 value, ok := set.data[key] 46 set.mutex.RUnlock() 47 return value, ok 48 } 49 50 // 与other集合组合成新集合,相同键值时,other覆盖set 51 func (set *SetObject[K, V]) Combine(other *SetObject[K, V]) *SetObject[K, V] { 52 newSet := New[K, V]() 53 data := newSet.data 54 set.mutex.Lock() 55 for key, value := range set.data { 56 data[key] = value 57 } 58 for key, value := range other.data { 59 data[key] = value 60 } 61 set.mutex.Unlock() 62 return newSet 63 } 64 65 func (set *SetObject[K, V]) Delete(key K) { 66 set.mutex.Lock() 67 delete(set.data, key) 68 set.mutex.Unlock() 69 } 70 71 func (set *SetObject[K, V]) Exists(key K) bool { 72 set.mutex.RLock() 73 _, ok := set.data[key] 74 set.mutex.RUnlock() 75 return ok 76 } 77 78 func (set *SetObject[K, V]) Length() int { 79 set.mutex.RLock() 80 length := len(set.data) 81 set.mutex.RUnlock() 82 return length 83 } 84 func (set *SetObject[K, V]) Pop(key K) (v V, exists bool) { 85 set.mutex.Lock() 86 v, exists = set.data[key] 87 delete(set.data, key) 88 set.mutex.Unlock() 89 return v, exists 90 } 91 func (set *SetObject[K, V]) IsEmpty() bool { 92 return set.Length() == 0 93 } 94 95 func (set *SetObject[K, V]) Items() (items []V) { 96 l := len(set.data) 97 items = make([]V, l, l) 98 set.mutex.RLock() 99 i := 0 100 for _, item := range set.data { 101 items[i] = item 102 i++ 103 } 104 set.mutex.RUnlock() 105 return 106 } 107 108 func (set *SetObject[K, V]) Keys() (keys []K) { 109 l := len(set.data) 110 keys = make([]K, l, l) 111 set.mutex.RLock() 112 i := 0 113 for key := range set.data { 114 keys[i] = key 115 i++ 116 } 117 set.mutex.RUnlock() 118 return 119 } 120 121 // 如果返回错误,迭代终止 122 func (set *SetObject[K, V]) ForRange(handler func(key K, val V) (err error)) error { 123 set.mutex.RLock() 124 defer set.mutex.RUnlock() 125 for key, val := range set.data { 126 err := handler(key, val) 127 if err != nil { 128 return err 129 } 130 } 131 132 return nil 133 } 134 135 // func(key string, val V) bool{} 136 func (set *SetObject[K, V]) First(handler func(key K, val V) bool) (result V) { 137 set.mutex.RLock() 138 defer set.mutex.RUnlock() 139 for key, val := range set.data { 140 if handler(key, val) { 141 return val 142 } 143 } 144 145 return 146 } 147 148 // 返回符合条件的项形成的新集合 149 func (set *SetObject[K, V]) Filter(cond func(key K, val V) bool) *SetObject[K, V] { 150 set.mutex.RLock() 151 var a = map[K]V{} 152 for key, val := range set.data { 153 if cond(key, val) { 154 a[key] = val 155 } 156 } 157 set.mutex.RUnlock() 158 return &SetObject[K, V]{ 159 data: a, 160 } 161 }