1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2025-07-18 08:32:40 +08:00
Files
go-mixed/collections/generics/rwlock_map.go
2022-03-27 10:23:14 +08:00

61 lines
965 B
Go

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)
}