dockerfiles/anylink/server/pkg/utils/maps.go

116 lines
1.8 KiB
Go
Raw Normal View History

2022-11-10 15:53:48 +08:00
package utils
import (
"sync"
cmap "github.com/orcaman/concurrent-map"
)
type IMaps interface {
Set(key string, val interface{})
Get(key string) (interface{}, bool)
Del(key string)
}
/**
* 基础的Map结构
*
*/
type BaseMap struct {
m map[string]interface{}
}
func (m *BaseMap) Set(key string, value interface{}) {
m.m[key] = value
}
func (m *BaseMap) Get(key string) (interface{}, bool) {
v, ok := m.m[key]
return v, ok
}
func (m *BaseMap) Del(key string) {
delete(m.m, key)
}
/**
* CMap 并发结构
*
*/
type ConcurrentMap struct {
m cmap.ConcurrentMap
}
func (m *ConcurrentMap) Set(key string, value interface{}) {
m.m.Set(key, value)
}
func (m *ConcurrentMap) Get(key string) (interface{}, bool) {
return m.m.Get(key)
}
func (m *ConcurrentMap) Del(key string) {
m.m.Remove(key)
}
/**
* Map 读写结构
*
*/
type RWLockMap struct {
m map[string]interface{}
lock sync.RWMutex
}
func (m *RWLockMap) Set(key string, value interface{}) {
m.lock.Lock()
defer m.lock.Unlock()
m.m[key] = value
}
func (m *RWLockMap) Get(key string) (interface{}, bool) {
m.lock.RLock()
defer m.lock.RUnlock()
v, ok := m.m[key]
return v, ok
}
func (m *RWLockMap) Del(key string) {
m.lock.Lock()
defer m.lock.Unlock()
delete(m.m, key)
}
/**
* sync.Map 结构
*
*/
type SyncMap struct {
m sync.Map
}
func (m *SyncMap) Set(key string, val interface{}) {
m.m.Store(key, val)
}
func (m *SyncMap) Get(key string) (interface{}, bool) {
return m.m.Load(key)
}
func (m *SyncMap) Del(key string) {
m.m.Delete(key)
}
func NewMap(name string, len int) IMaps {
switch name {
case "cmap":
return &ConcurrentMap{m: cmap.New()}
case "rwmap":
m := make(map[string]interface{}, len)
return &RWLockMap{m: m}
case "syncmap":
return &SyncMap{}
default:
m := make(map[string]interface{}, len)
return &BaseMap{m: m}
}
}