map.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package maps
  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) (value V, found bool) {
  30. if p.safe {
  31. p.mutex.RLock()
  32. defer p.mutex.RUnlock()
  33. }
  34. value, found = p.m[key]
  35. return
  36. }
  37. func (p *Map[K, V]) Remove(key K) {
  38. if p.safe {
  39. p.mutex.Lock()
  40. defer p.mutex.Unlock()
  41. }
  42. delete(p.m, key)
  43. }
  44. func (p *Map[K, V]) Size() int {
  45. if p.safe {
  46. p.mutex.RLock()
  47. defer p.mutex.RUnlock()
  48. }
  49. return len(p.m)
  50. }
  51. func (p *Map[K, V]) Empty() bool {
  52. return p.Size() == 0
  53. }
  54. func (p *Map[K, V]) Keys() []K {
  55. keys := make([]K, p.Size())
  56. if p.safe {
  57. p.mutex.RLock()
  58. defer p.mutex.RUnlock()
  59. }
  60. count := 0
  61. for key := range p.m {
  62. keys[count] = key
  63. count++
  64. }
  65. return keys
  66. }
  67. func (p *Map[K, V]) Values() []V {
  68. values := make([]V, p.Size())
  69. if p.safe {
  70. p.mutex.RLock()
  71. defer p.mutex.RUnlock()
  72. }
  73. count := 0
  74. for _, value := range p.m {
  75. values[count] = value
  76. count++
  77. }
  78. return values
  79. }
  80. func (p *Map[K, V]) Clear() {
  81. if p.safe {
  82. p.mutex.Lock()
  83. defer p.mutex.Unlock()
  84. }
  85. p.m = make(map[K]V)
  86. }
  87. func (p *Map[K, V]) String() string {
  88. return fmt.Sprintf("%v, safe = %v", p.m, p.safe)
  89. }