go笔记--协程安全map的四种方法

go笔记–go协程安全map的四种方法


读写锁

这个应该是最简单的方法,读取的时候加读锁,修改的时候加写锁。

type LockMap struct {
	m map[interface{}]interface{}
	sync.RWMutex
}

func (lm *LockMap) Get(key interface{}) (value interface{}, ok bool) {
	lm.RLock()
	defer lm.RUnlock()
	value, ok = lm.m[key]
	return
}

func (lm *LockMap) Put(key interface{}, value interface{}) {
	lm.Lock()
	defer lm.Unlock()
	lm.m[key] = value
}

func (lm *LockMap) Del(key interface{}) {
	lm.Lock()
	defer lm.Unlock()
	delete(lm.m, key)
}

sync.map

同时sync.Map是不需要初始化的。

var smap sync.Map

func Set (k,v interface{}){
    smap.Store(k,v)
}

func Get (k interface{}) interface{}{
    v ,exit := smap.Load(k)
    if exit {
        return v
    }
    return nil
}

func Del(key interface{}){
    smap.Delete(key)
}

func MapRange (funcs func(key, value interface{}) bool) {
    smap.Range(funcs)
}

atomic.Value

在kratos 里面看到的一种协程安全map,利用了atomic.Value来封装的。

package paladin

import (
	"strings"
	"sync/atomic"
)

// KeyNamed key naming to lower case.
func KeyNamed(key string) string {
	return strings.ToLower(key)
}

// Map is config map, key(filename) -> value(file).
type Map struct {
	values atomic.Value
}

// Store sets the value of the Value to values map.
func (m *Map) Store(values map[string]*Value) {
	dst := make(map[string]*Value, len(values))
	for k, v := range values {
		dst[KeyNamed(k)] = v
	}
	m.values.Store(dst)
}

// Load returns the value set by the most recent Store.
func (m *Map) Load() map[string]*Value {
	src := m.values.Load().(map[string]*Value)
	dst := make(map[string]*Value, len(src))
	for k, v := range src {
		dst[k] = v
	}
	return dst
}

// Exist check if values map exist a key.
func (m *Map) Exist(key string) bool {
	_, ok := m.Load()[KeyNamed(key)]
	return ok
}

// Get return get value by key.
func (m *Map) Get(key string) *Value {
	v, ok := m.Load()[KeyNamed(key)]
	if ok {
		return v
	}
	return &Value{}
}

// Keys return map keys.
func (m *Map) Keys() []string {
	values := m.Load()
	keys := make([]string, 0, len(values))
	for key := range values {
		keys = append(keys, key)
	}
	return keys
}

chan

最后一种方法当然就是管道啦,select:case 万精油的方法嘛, 这里就不放例程了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值