1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2025-07-18 08:32:40 +08:00
This commit is contained in:
2022-03-27 10:23:14 +08:00
parent 38d75633d9
commit 6f1eadb7b5
8 changed files with 430 additions and 0 deletions

View File

@ -0,0 +1,60 @@
package generics
import "sync"
var _ Map[string, string] = &RWLockMap[string, string]{}
type RWLockMap[K comparable, V any] struct {
m map[K]V
lock sync.RWMutex
}
func NewRWLockMap[K comparable, V any]() Map[K, V] {
return &RWLockMap[K, V]{
m: make(map[K]V),
}
}
func (m *RWLockMap[K, V]) Get(key K) (V, bool) {
m.lock.RLock()
v, ok := m.m[key]
m.lock.RUnlock()
return v, ok
}
func (m *RWLockMap[K, V]) Set(key K, value V) {
m.lock.Lock()
m.m[key] = value
m.lock.Unlock()
}
func (m *RWLockMap[K, V]) Delete(key K) {
m.lock.Lock()
delete(m.m, key)
m.lock.Unlock()
}
func (m *RWLockMap[K, V]) ForEach(f func(K, V)) {
for k, v := range m.m {
f(k, v)
}
}
func (m *RWLockMap[K, V]) Clone() Map[K, V] {
new := make(map[K]V, m.Count())
for k, v := range m.m {
new[k] = v
}
return &RWLockMap[K, V]{
m: new,
}
}
func (m *RWLockMap[K, V]) Clear() {
m.m = make(map[K]V)
}
func (m *RWLockMap[K, V]) Count() int {
return len(m.m)
}