package iotMap import ( iotInterface "IotAdmin/iot/interface" "sync" ) type MeterCalcMap struct { RWLock sync.Mutex //sync.RWMutex Map *sync.Map } func NewMeterCalcMap() *MeterCalcMap { cm := &MeterCalcMap{ Map: new(sync.Map), } return cm } func (cm *MeterCalcMap) Add(key string, val *iotInterface.MeterCalcHandler) { cm.Map.Store(key, val) } func (cm *MeterCalcMap) Remove(key string) { cm.Map.Delete(key) } func (cm *MeterCalcMap) Get(key string) (*iotInterface.MeterCalcHandler, bool) { var res *iotInterface.MeterCalcHandler x, ok := cm.Map.Load(key) if ok { res = x.(*iotInterface.MeterCalcHandler) return res, true } return res, false } // AlterKey 修改key func (cm *MeterCalcMap) AlterKey(before, after string) bool { if before == after { return true } if v, ok := cm.Map.Load(before); !ok { return false } else { if _, ok = cm.Map.Load(after); ok { return false } val := v.(*iotInterface.MeterCalcHandler) cm.Map.Store(after, val) cm.Map.Delete(before) return true } } func (cm *MeterCalcMap) Len() int { c := 0 cm.Map.Range(func(key, value interface{}) bool { c++ return true }) return c } func (cm *MeterCalcMap) Clean() { cm.Map = new(sync.Map) }