sync_dict.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Author: simon (ynwdlxm@163.com)
  2. // Date: 2025/9/15 17:07
  3. // Desc:
  4. package dict
  5. import (
  6. "sync"
  7. )
  8. type SyncDict struct {
  9. m sync.Map
  10. }
  11. func (s *SyncDict) Get(key string) (any, bool) {
  12. value, ok := s.m.Load(key)
  13. return value, ok
  14. }
  15. func (s *SyncDict) Len() int {
  16. length := 0
  17. s.m.Range(func(key, value any) bool {
  18. length++
  19. return true
  20. })
  21. return length
  22. }
  23. func (s *SyncDict) Put(key string, value any) (result int) {
  24. _, ok := s.m.Load(key)
  25. s.m.Store(key, value)
  26. if ok {
  27. result = 0
  28. } else {
  29. result = 1
  30. }
  31. return
  32. }
  33. func (s *SyncDict) PutIfAbsent(key string, value any) (result int) {
  34. _, ok := s.m.Load(key)
  35. if ok {
  36. return 0
  37. }
  38. s.m.Store(key, value)
  39. return 1
  40. }
  41. func (s *SyncDict) PutIfExists(key string, value any) (result int) {
  42. _, ok := s.m.Load(key)
  43. if ok {
  44. s.m.Store(key, value)
  45. return 1
  46. }
  47. return 0
  48. }
  49. func (s *SyncDict) Remove(key string) (result int) {
  50. _, ok := s.m.Load(key)
  51. if ok {
  52. s.m.Delete(key)
  53. return 1
  54. }
  55. return 0
  56. }
  57. func (s *SyncDict) ForEach(consumer Consumer) {
  58. s.m.Range(func(key, value any) bool {
  59. consumer(key.(string), value)
  60. return true
  61. })
  62. }
  63. func (s *SyncDict) Keys() []string {
  64. result := make([]string, s.Len())
  65. s.m.Range(func(key, value any) bool {
  66. result = append(result, key.(string))
  67. return true
  68. })
  69. return result
  70. }
  71. func (s *SyncDict) RandomKeys(limit int) []string {
  72. result := make([]string, limit)
  73. for i := 0; i < limit; i++ {
  74. s.m.Range(func(key, value any) bool {
  75. result[i] = key.(string)
  76. return false
  77. })
  78. }
  79. return result
  80. }
  81. func (s *SyncDict) RandomDistinctKeys(limit int) []string {
  82. result := make([]string, limit)
  83. i := 0
  84. s.m.Range(func(key, value any) bool {
  85. result[i] = key.(string)
  86. i++
  87. return i < limit // 如果返回false,则结束遍历
  88. })
  89. return result
  90. }
  91. func (s *SyncDict) Clear() {
  92. *s = *NewSyncDict()
  93. }
  94. func NewSyncDict() *SyncDict {
  95. return &SyncDict{}
  96. }