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
}

posted @ 2020-07-28 09:44  Kingram  阅读(555)  评论(0编辑  收藏  举报