zoukankan      html  css  js  c++  java
  • 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
    }
    
    
  • 相关阅读:
    [收藏]15分钟内快速构建数据访问层
    asp.net 水晶报表主从表关联问题
    C#基础——关于类
    C#和Sql的时间操作心得(一)
    DataGrid导出到Word/Excel文档
    [收藏]SQL Server 索引结构及其使用
    .NET环境下水晶报表使用总结
    读写文件之日志文件
    HashTable实现购物车,抛弃数据库实现方式
    触碰心灵34句
  • 原文地址:https://www.cnblogs.com/Kingram/p/13389346.html
Copyright © 2011-2022 走看看