mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-11-01 00:59:34 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			116 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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}
 | |
| 	}
 | |
| }
 |