mirror of
https://github.com/pyihe/go-pkg.git
synced 2025-10-14 04:03:41 +08:00
102 lines
1.5 KiB
Go
102 lines
1.5 KiB
Go
package maps
|
|
|
|
import "sync"
|
|
|
|
type Map struct {
|
|
sync.RWMutex
|
|
m map[interface{}]interface{}
|
|
}
|
|
|
|
func (m *Map) init() {
|
|
if m.m == nil {
|
|
m.m = make(map[interface{}]interface{})
|
|
}
|
|
}
|
|
|
|
func (m *Map) UnsafeGet(key interface{}) interface{} {
|
|
if m.m == nil {
|
|
return nil
|
|
} else {
|
|
return m.m[key]
|
|
}
|
|
}
|
|
|
|
func (m *Map) Get(key interface{}) interface{} {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
return m.UnsafeGet(key)
|
|
}
|
|
|
|
func (m *Map) UnsafeSet(key interface{}, value interface{}) {
|
|
m.init()
|
|
m.m[key] = value
|
|
}
|
|
|
|
func (m *Map) Set(key interface{}, value interface{}) {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
m.UnsafeSet(key, value)
|
|
}
|
|
|
|
func (m *Map) TestAndSet(key interface{}, value interface{}) interface{} {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
m.init()
|
|
|
|
if v, ok := m.m[key]; ok {
|
|
return v
|
|
} else {
|
|
m.m[key] = value
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (m *Map) UnsafeDel(key interface{}) {
|
|
m.init()
|
|
delete(m.m, key)
|
|
}
|
|
|
|
func (m *Map) Del(key interface{}) {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
m.UnsafeDel(key)
|
|
}
|
|
|
|
func (m *Map) UnsafeLen() int {
|
|
if m.m == nil {
|
|
return 0
|
|
} else {
|
|
return len(m.m)
|
|
}
|
|
}
|
|
|
|
func (m *Map) Len() int {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
return m.UnsafeLen()
|
|
}
|
|
|
|
func (m *Map) UnsafeRange(f func(interface{}, interface{}) bool) {
|
|
if m.m == nil {
|
|
return
|
|
}
|
|
for k, v := range m.m {
|
|
if f(k, v) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *Map) RLockRange(f func(interface{}, interface{}) bool) {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
m.UnsafeRange(f)
|
|
}
|
|
|
|
func (m *Map) LockRange(f func(interface{}, interface{}) bool) {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
m.UnsafeRange(f)
|
|
}
|