map.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package mhayaMap
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. // Map 泛型map,可加锁
  7. type Map[K comparable, V any] struct {
  8. mutex sync.RWMutex
  9. m map[K]V
  10. safe bool
  11. }
  12. func NewMap[K comparable, V any](safe ...bool) *Map[K, V] {
  13. mp := &Map[K, V]{
  14. m: make(map[K]V),
  15. safe: false,
  16. }
  17. if len(safe) > 0 {
  18. mp.safe = safe[0]
  19. }
  20. return mp
  21. }
  22. func (p *Map[K, V]) Put(key K, value V) {
  23. if p.safe {
  24. p.mutex.Lock()
  25. defer p.mutex.Unlock()
  26. }
  27. p.m[key] = value
  28. }
  29. func (p *Map[K, V]) Get(key K) (V, bool) {
  30. if p.safe {
  31. p.mutex.RLock()
  32. defer p.mutex.RUnlock()
  33. }
  34. value, found := p.m[key]
  35. return value, found
  36. }
  37. func (p *Map[K, V]) Remove(key K) (V, bool) {
  38. if p.safe {
  39. p.mutex.Lock()
  40. defer p.mutex.Unlock()
  41. }
  42. v, found := p.m[key]
  43. if found {
  44. delete(p.m, key)
  45. }
  46. return v, found
  47. }
  48. func (p *Map[K, V]) Size() int {
  49. if p.safe {
  50. p.mutex.RLock()
  51. defer p.mutex.RUnlock()
  52. }
  53. return len(p.m)
  54. }
  55. func (p *Map[K, V]) Empty() bool {
  56. return p.Size() == 0
  57. }
  58. func (p *Map[K, V]) Keys() []K {
  59. keys := make([]K, p.Size())
  60. if p.safe {
  61. p.mutex.RLock()
  62. defer p.mutex.RUnlock()
  63. }
  64. count := 0
  65. for key := range p.m {
  66. keys[count] = key
  67. count++
  68. }
  69. return keys
  70. }
  71. func (p *Map[K, V]) Values() []V {
  72. values := make([]V, p.Size())
  73. if p.safe {
  74. p.mutex.RLock()
  75. defer p.mutex.RUnlock()
  76. }
  77. count := 0
  78. for _, value := range p.m {
  79. values[count] = value
  80. count++
  81. }
  82. return values
  83. }
  84. func (p *Map[K, V]) Clear() {
  85. if p.safe {
  86. p.mutex.Lock()
  87. defer p.mutex.Unlock()
  88. }
  89. p.m = make(map[K]V)
  90. }
  91. func (p *Map[K, V]) String() string {
  92. return fmt.Sprintf("%v, safe = %v", p.m, p.safe)
  93. }