| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 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}
- }
- }
|