github.com/sandwich-go/boost@v1.3.29/xcontainer/templates/sarray/sarray.go (about) 1 // sarray 包提供了一个同步的数组实现 2 // 可以产生一个带读写锁的线程安全的SyncArray,也可以产生一个非线程安全的SyncArray 3 // New 产生非协程安全的版本 4 // NewSync 产生协程安全的版本 5 package sarray 6 7 import ( 8 "encoding/json" 9 "fmt" 10 "math/rand" 11 "sort" 12 "sync" 13 ) 14 15 //template type SyncArray(VType) 16 17 type VType interface{} 18 19 // SyncArray 包含一个读写锁和一个切片,根据不同需求可提供对切片协程安全版本或者非协程安全版本的实例 20 type SyncArray struct { 21 mu *localRWMutexVType 22 array []VType 23 } 24 25 // New 创建非协程安全版本 26 func New() *SyncArray { return newWithSafe(false) } 27 28 // NewSync 创建协程安全版本 29 func NewSync() *SyncArray { return newWithSafe(true) } 30 31 func newWithSafe(safe bool) *SyncArray { 32 return &SyncArray{ 33 mu: newLocalRWMutexVType(safe), 34 array: make([]VType, 0), 35 } 36 } 37 38 // At 返回指定位置元素,如果越界则返回默认空值 39 func (a *SyncArray) At(index int) (value VType) { 40 value, _ = a.Get(index) 41 return 42 } 43 44 // Get 返回指定位置元素,found标识元素是否存在 45 func (a *SyncArray) Get(index int) (value VType, found bool) { 46 a.mu.RLock() 47 defer a.mu.RUnlock() 48 if index < 0 || index >= len(a.array) { 49 return 50 } 51 return a.array[index], true 52 } 53 54 func (a *SyncArray) errorIndexOutRangeUnLock(index int) error { 55 return fmt.Errorf("index %d out of array range %d", index, len(a.array)) 56 } 57 58 // Set 设定指定位置数据 59 func (a *SyncArray) Set(index int, value VType) error { 60 a.mu.Lock() 61 defer a.mu.Unlock() 62 if index < 0 || index >= len(a.array) { 63 return a.errorIndexOutRangeUnLock(index) 64 } 65 a.array[index] = value 66 return nil 67 } 68 69 // SetArray 替换底层存储 70 func (a *SyncArray) SetArray(array []VType) *SyncArray { 71 a.mu.Lock() 72 defer a.mu.Unlock() 73 a.array = array 74 return a 75 } 76 77 // Replace 替换指定位置元素 78 func (a *SyncArray) Replace(given []VType) *SyncArray { 79 a.mu.Lock() 80 defer a.mu.Unlock() 81 max := len(given) 82 if max > len(a.array) { 83 max = len(a.array) 84 } 85 for i := 0; i < max; i++ { 86 a.array[i] = given[i] 87 } 88 return a 89 } 90 91 // SortFunc 根据指定的方法进行排序 92 func (a *SyncArray) SortFunc(less func(v1, v2 VType) bool) *SyncArray { 93 a.mu.Lock() 94 defer a.mu.Unlock() 95 sort.Slice(a.array, func(i, j int) bool { 96 return less(a.array[i], a.array[j]) 97 }) 98 return a 99 } 100 101 // InsertBefore 在index位置前插入数据 102 func (a *SyncArray) InsertBefore(index int, value VType) error { 103 a.mu.Lock() 104 defer a.mu.Unlock() 105 if index < 0 || index >= len(a.array) { 106 return a.errorIndexOutRangeUnLock(index) 107 } 108 rear := append([]VType{}, a.array[index:]...) 109 a.array = append(a.array[0:index], value) 110 a.array = append(a.array, rear...) 111 return nil 112 } 113 114 // InsertAfter 在index位置后插入数据 115 func (a *SyncArray) InsertAfter(index int, value VType) error { 116 a.mu.Lock() 117 defer a.mu.Unlock() 118 if index < 0 || index >= len(a.array) { 119 return a.errorIndexOutRangeUnLock(index) 120 } 121 rear := append([]VType{}, a.array[index+1:]...) 122 a.array = append(a.array[0:index+1], value) 123 a.array = append(a.array, rear...) 124 return nil 125 } 126 127 // Contains 是否存在value 128 func (a *SyncArray) Contains(value VType) bool { 129 return a.Search(value) != -1 130 } 131 132 // Search 查找元素,如果存在则返回index,不存在返回-1 133 func (a *SyncArray) Search(value VType) int { 134 a.mu.RLock() 135 defer a.mu.RUnlock() 136 if len(a.array) == 0 { 137 return -1 138 } 139 result := -1 140 for index, v := range a.array { 141 if v == value { 142 result = index 143 break 144 } 145 } 146 return result 147 } 148 149 // DeleteValue 查找并删除找到的第一个元素,不存在返回false 150 func (a *SyncArray) DeleteValue(value VType) (found bool) { 151 if i := a.Search(value); i != -1 { 152 _, found = a.LoadAndDelete(i) 153 return found 154 } 155 return false 156 } 157 158 // LoadAndDelete 删除元素,如果删除成功返回被删除的元素 159 func (a *SyncArray) LoadAndDelete(index int) (value VType, found bool) { 160 a.mu.Lock() 161 defer a.mu.Unlock() 162 return a.doDeleteWithoutLock(index) 163 } 164 165 // doRemoveWithoutLock 不加锁移除元素 166 func (a *SyncArray) doDeleteWithoutLock(index int) (value VType, found bool) { 167 if index < 0 || index >= len(a.array) { 168 return 169 } 170 if index == 0 { 171 value = a.array[0] 172 a.array = a.array[1:] 173 return value, true 174 } else if index == len(a.array)-1 { 175 value = a.array[index] 176 a.array = a.array[:index] 177 return value, true 178 } 179 value = a.array[index] 180 a.array = append(a.array[:index], a.array[index+1:]...) 181 return value, true 182 } 183 184 // PushLeft 头插入 185 func (a *SyncArray) PushLeft(value ...VType) *SyncArray { 186 a.mu.Lock() 187 a.array = append(value, a.array...) 188 a.mu.Unlock() 189 return a 190 } 191 192 // PushRight 尾插入 193 func (a *SyncArray) PushRight(value ...VType) *SyncArray { 194 a.mu.Lock() 195 a.array = append(a.array, value...) 196 a.mu.Unlock() 197 return a 198 } 199 200 // PopLeft 头弹出 201 func (a *SyncArray) PopLeft() (value VType, found bool) { 202 a.mu.Lock() 203 defer a.mu.Unlock() 204 if len(a.array) == 0 { 205 return 206 } 207 value = a.array[0] 208 a.array = a.array[1:] 209 return value, true 210 } 211 212 // PopRight 尾弹出 213 func (a *SyncArray) PopRight() (value VType, found bool) { 214 a.mu.Lock() 215 defer a.mu.Unlock() 216 index := len(a.array) - 1 217 if index < 0 { 218 return 219 } 220 value = a.array[index] 221 a.array = a.array[:index] 222 return value, true 223 } 224 225 // PopRand 随机弹出 226 func (a *SyncArray) PopRand() (value VType, found bool) { 227 a.mu.Lock() 228 defer a.mu.Unlock() 229 return a.doDeleteWithoutLock(rand.Intn(len(a.array))) 230 } 231 232 // PopRands 随机n个元素并弹出,如果size大于数组尺寸则全部弹出 233 func (a *SyncArray) PopRands(size int) []VType { 234 a.mu.Lock() 235 defer a.mu.Unlock() 236 if size <= 0 || len(a.array) == 0 { 237 return nil 238 } 239 if size >= len(a.array) { 240 size = len(a.array) 241 } 242 array := make([]VType, size) 243 for i := 0; i < size; i++ { 244 array[i], _ = a.doDeleteWithoutLock(rand.Intn(len(a.array))) 245 } 246 return array 247 } 248 249 // Append 尾添加元素 alias of PushRight 250 func (a *SyncArray) Append(value ...VType) *SyncArray { return a.PushRight(value...) } 251 252 // Len 获取长度 253 func (a *SyncArray) Len() int { 254 a.mu.RLock() 255 length := len(a.array) 256 a.mu.RUnlock() 257 return length 258 } 259 260 // Slice 获取底层数据存储,如果为sync安全模式则返回一份拷贝,否则直接返回底层数据指针 261 func (a *SyncArray) Slice() []VType { 262 array := ([]VType)(nil) 263 if a.mu.IsSafe() { 264 a.mu.RLock() 265 defer a.mu.RUnlock() 266 array = make([]VType, len(a.array)) 267 copy(array, a.array) 268 } else { 269 array = a.array 270 } 271 return array 272 } 273 274 // Clear 清空存储 275 func (a *SyncArray) Clear() *SyncArray { 276 a.mu.Lock() 277 if len(a.array) > 0 { 278 a.array = make([]VType, 0) 279 } 280 a.mu.Unlock() 281 return a 282 } 283 284 // LockFunc 写锁操作array 285 func (a *SyncArray) LockFunc(f func(array []VType)) *SyncArray { 286 a.mu.Lock() 287 defer a.mu.Unlock() 288 f(a.array) 289 return a 290 } 291 292 // RLockFunc 读锁操作array 293 func (a *SyncArray) RLockFunc(f func(array []VType)) *SyncArray { 294 a.mu.RLock() 295 defer a.mu.RUnlock() 296 f(a.array) 297 return a 298 } 299 300 // Rand 随机一个元素 301 func (a *SyncArray) Rand() (value VType, found bool) { 302 a.mu.RLock() 303 defer a.mu.RUnlock() 304 if len(a.array) == 0 { 305 return 306 } 307 return a.array[rand.Intn(len(a.array))], true 308 } 309 310 // WalkAsc 按照index从小到大的顺序进行遍历,并将k,v作为参数执行f。如果f执行返回false则中止 311 func (a *SyncArray) WalkAsc(f func(k int, v VType) bool) { 312 a.mu.RLock() 313 defer a.mu.RUnlock() 314 for k, v := range a.array { 315 if !f(k, v) { 316 break 317 } 318 } 319 } 320 321 // WalkDesc 按照index从大到小的顺序进行遍历,并将k,v作为参数执行f。如果f执行返回false则中止 322 func (a *SyncArray) WalkDesc(f func(k int, v VType) bool) { 323 a.mu.RLock() 324 defer a.mu.RUnlock() 325 for i := len(a.array) - 1; i >= 0; i-- { 326 if !f(i, a.array[i]) { 327 break 328 } 329 } 330 } 331 332 // MarshalJSON 序列化到json 333 func (a SyncArray) MarshalJSON() ([]byte, error) { 334 a.mu.RLock() 335 defer a.mu.RUnlock() 336 return json.Marshal(a.array) 337 } 338 339 // UnmarshalJSON 由json反序列化 340 func (a *SyncArray) UnmarshalJSON(b []byte) error { 341 if a.array == nil { 342 a.array = make([]VType, 0) 343 } 344 a.mu.Lock() 345 defer a.mu.Unlock() 346 if err := json.Unmarshal(b, &a.array); err != nil { 347 return err 348 } 349 return nil 350 } 351 352 // Empty 是否为空 353 func (a *SyncArray) Empty() bool { return a.Len() == 0 } 354 355 type localRWMutexVType struct { 356 *sync.RWMutex 357 } 358 359 func newLocalRWMutexVType(safe bool) *localRWMutexVType { 360 mu := localRWMutexVType{} 361 if safe { 362 mu.RWMutex = new(sync.RWMutex) 363 } 364 return &mu 365 } 366 367 func (mu *localRWMutexVType) IsSafe() bool { 368 return mu.RWMutex != nil 369 } 370 371 func (mu *localRWMutexVType) Lock() { 372 if mu.RWMutex != nil { 373 mu.RWMutex.Lock() 374 } 375 } 376 377 func (mu *localRWMutexVType) Unlock() { 378 if mu.RWMutex != nil { 379 mu.RWMutex.Unlock() 380 } 381 } 382 383 func (mu *localRWMutexVType) RLock() { 384 if mu.RWMutex != nil { 385 mu.RWMutex.RLock() 386 } 387 } 388 389 func (mu *localRWMutexVType) RUnlock() { 390 if mu.RWMutex != nil { 391 mu.RWMutex.RUnlock() 392 } 393 }