Golang封装一个加锁的Map工具包
package utils
import (
"sync"
)
type BeeMap struct {
Lock *sync.RWMutex
BM map[string]interface{}
}
// 新建Map集合
func NewBeeMap() *BeeMap {
return &BeeMap{
Lock: new(sync.RWMutex),
BM: make(map[string]interface{}),
}
}
// 通过key获取value
func (m *BeeMap) Get(k string) interface{} {
m.Lock.RLock()
defer m.Lock.RUnlock()
if val, ok := m.BM[k]; ok {
return val
}
return nil
}
// 不覆盖存元素
func (m *BeeMap) Set(k string, v interface{}) bool {
m.Lock.Lock()
defer m.Lock.Unlock()
if val, ok := m.BM[k]; !ok {
m.BM[k] = v
} else if val != v {
m.BM[k] = v
} else {
return false
}
return true
}
// 覆盖存元素
func (m *BeeMap) ReSet(k string, v interface{}) bool {
m.Delete(k)
m.Set(k, v)
return true
}
// 判断是否存在该key
func (m *BeeMap) Check(k string) bool {
m.Lock.RLock()
defer m.Lock.RUnlock()
if _, ok := m.BM[k]; !ok {
return false
}
return true
}
// 通过key删除元素
func (m *BeeMap) Delete(k string) {
m.Lock.Lock()
defer m.Lock.Unlock()
delete(m.BM, k)
}
// 获取元素个数
func (m *BeeMap) Size() int {
m.Lock.RLock()
defer m.Lock.RUnlock()
return len(m.BM)
}
// 只读第一个
func (m *BeeMap) GetFirst() interface{} {
m.Lock.RLock()
defer m.Lock.RUnlock()
for _, v := range m.BM {
if v != nil {
return v
}
}
return nil
}
// 返回第一个,且从map中删除
func (m *BeeMap) DetachFirst() (string, interface{}) {
m.Lock.Lock()
defer m.Lock.Unlock()
for k, v := range m.BM {
if v != nil {
delete(m.BM, k)
return k, v
}
}
return "", nil
}