safe_map.go 785 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package util
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. )
  6. type SafeMap[K comparable, V any] struct {
  7. m sync.Map
  8. length int64 // 用于记录映射的长度
  9. }
  10. func (sm *SafeMap[K, V]) Set(key K, value V) {
  11. sm.m.Store(key, value)
  12. atomic.AddInt64(&sm.length, 1)
  13. }
  14. func (sm *SafeMap[K, V]) Get(key K) (V, bool) {
  15. value, ok := sm.m.Load(key)
  16. if !ok {
  17. var zero V
  18. return zero, false
  19. }
  20. return value.(V), true
  21. }
  22. func (sm *SafeMap[K, V]) Delete(key K) {
  23. sm.m.Delete(key)
  24. atomic.AddInt64(&sm.length, -1)
  25. }
  26. func (sm *SafeMap[K, V]) Length() int {
  27. return int(atomic.LoadInt64(&sm.length))
  28. }
  29. func (sm *SafeMap[K, V]) Range(fn func(V) bool) {
  30. sm.m.Range(func(key, value any) bool {
  31. return fn(value.(V))
  32. })
  33. }
  34. func (sm *SafeMap[K, V]) Clear() {
  35. sm.m = sync.Map{}
  36. sm.length = 0
  37. }