• Golang封装一个加锁的Map工具包


    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
    }
    
    
  • 相关阅读:
    《编写可维护的JavaScript》读书笔记
    第十四天:还是看代码
    第十三天:过了一遍rt_thread,看代码架构
    第十二天:rt_thread系统
    第十一天:要做stm32了
    第十天:没太专注工作
    第九天:rtc问题查找与测试
    第八天:android编译环境搭建
    第七天:终于看到板子了
    第六天和周末:感慨下这周
  • 原文地址:https://www.cnblogs.com/Kingram/p/13389346.html
Copyright © 2020-2023  润新知