map.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package jconcurrency
  2. import (
  3. "sync"
  4. )
  5. //HashMap对象,局限安全操作,对外暴露了锁和数据,在自行遍历如果再加锁就会死锁!
  6. type JyMap struct {
  7. Lock sync.RWMutex
  8. Data map[any]any
  9. }
  10. func NewJM() *JyMap {
  11. return &JyMap{Data: map[any]any{}}
  12. }
  13. //设置
  14. func (jm *JyMap) Set(k, v any) {
  15. jm.Lock.Lock()
  16. jm.Data[k] = v
  17. jm.Lock.Unlock()
  18. }
  19. //获取
  20. func (jm *JyMap) Get(k any) (v any) {
  21. jm.Lock.RLock()
  22. defer jm.Lock.RUnlock()
  23. return jm.Data[k]
  24. }
  25. //获取并删除
  26. func (jm *JyMap) GetAndDel(k any) (v any) {
  27. jm.Lock.Lock()
  28. defer jm.Lock.Unlock()
  29. v = jm.Data[k]
  30. delete(jm.Data, k)
  31. return
  32. }
  33. //仅删除
  34. func (jm *JyMap) Del(k any) {
  35. jm.Lock.Lock()
  36. defer jm.Lock.Unlock()
  37. delete(jm.Data, k)
  38. return
  39. }
  40. //如果不存在则设置
  41. func (jm *JyMap) SetIfNoExists(k, v any) {
  42. jm.Lock.Lock()
  43. defer jm.Lock.Unlock()
  44. if jm.Data[k] == nil {
  45. jm.Data[k] = v
  46. }
  47. }
  48. //map中是否存在
  49. func (jm *JyMap) Has(k any) bool {
  50. jm.Lock.RLock()
  51. defer jm.Lock.RUnlock()
  52. return jm.Data[k] != nil
  53. }
  54. //长度
  55. func (jm *JyMap) Len() int {
  56. jm.Lock.RLock()
  57. defer jm.Lock.RUnlock()
  58. return len(jm.Data)
  59. }
  60. //如果不使用此方法遍历,再调用自身的方法加锁,就会死锁
  61. //目前没有找到好的解决办法,只有自己控制好,特别是遍历的时候同时修改map
  62. func (jm *JyMap) Iter(fn func(k, v any) bool) {
  63. jm.Lock.RLock()
  64. ch := make(chan []any, len(jm.Data))
  65. go func() {
  66. L1:
  67. for {
  68. select {
  69. case arr, ok := <-ch:
  70. if !fn(arr[0], arr[1]) || !ok {
  71. _ = ch
  72. break L1
  73. }
  74. }
  75. }
  76. }()
  77. for k, v := range jm.Data {
  78. ch <- []any{k, v}
  79. }
  80. close(ch)
  81. jm.Lock.RUnlock()
  82. }