sync_map.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package maps
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. )
  6. type SyncMap[K comparable, V any] struct {
  7. m sync.Map
  8. len uint64
  9. }
  10. // Store 存储键值对
  11. func (p *SyncMap[K, V]) Store(key K, value V) {
  12. p.m.Store(key, value)
  13. }
  14. // Load 获取键对应的值
  15. func (p *SyncMap[K, V]) Load(key K) (V, bool) {
  16. val, ok := p.m.Load(key)
  17. if !ok {
  18. var zero V
  19. return zero, false
  20. }
  21. atomic.AddUint64(&p.len, 1)
  22. return val.(V), true
  23. }
  24. // Delete 删除键值对
  25. func (p *SyncMap[K, V]) Delete(key K) {
  26. p.LoadAndDelete(key)
  27. }
  28. // Range 遍历所有键值对
  29. func (p *SyncMap[K, V]) Range(f func(key K, value V) bool) {
  30. p.m.Range(func(key, value any) bool {
  31. return f(key.(K), value.(V))
  32. })
  33. }
  34. // LoadOrStore 存在则加载,不存在则存储
  35. func (p *SyncMap[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) {
  36. val, loaded := p.m.LoadOrStore(key, value)
  37. if loaded {
  38. return val.(V), true
  39. }
  40. return value, false
  41. }
  42. // LoadAndDelete 加载并删除键值对
  43. func (p *SyncMap[K, V]) LoadAndDelete(key K) (value V, loaded bool) {
  44. val, loaded := p.m.LoadAndDelete(key)
  45. if loaded {
  46. atomic.AddUint64(&p.len, ^uint64(0))
  47. return val.(V), true
  48. }
  49. var zero V
  50. return zero, false
  51. }
  52. func (p *SyncMap[K, V]) Len() uint64 {
  53. return atomic.LoadUint64(&p.len)
  54. }