github.com/songzhibin97/gkit@v1.2.13/internal/sys/safe_map/map.go (about)

     1  package safe_map
     2  
     3  import "sync"
     4  
     5  type RWMap struct { // 一个读写锁保护的线程安全的map
     6  	sync.RWMutex // 读写锁保护下面的map字段
     7  	m            map[int]int
     8  }
     9  
    10  // NewRWMap  新建一个RWMap
    11  func NewRWMap(n int) *RWMap {
    12  	return &RWMap{
    13  		m: make(map[int]int, n),
    14  	}
    15  }
    16  
    17  // Get 从map中读取一个值
    18  func (m *RWMap) Get(k int) (int, bool) {
    19  	m.RLock()
    20  	defer m.RUnlock()
    21  	v, existed := m.m[k] // 在锁的保护下从map中读取
    22  	return v, existed
    23  }
    24  
    25  // Set 设置一个键值对
    26  func (m *RWMap) Set(k int, v int) {
    27  	m.Lock() // 锁保护
    28  	defer m.Unlock()
    29  	m.m[k] = v
    30  }
    31  
    32  // Delete 删除一个键
    33  func (m *RWMap) Delete(k int) {
    34  	m.Lock() // 锁保护
    35  	defer m.Unlock()
    36  	delete(m.m, k)
    37  }
    38  
    39  // Len map的长度
    40  func (m *RWMap) Len() int {
    41  	m.RLock() // 锁保护
    42  	defer m.RUnlock()
    43  	return len(m.m)
    44  }
    45  
    46  // Each 遍历map
    47  func (m *RWMap) Each(f func(k, v int) bool) {
    48  	m.RLock() // 遍历期间一直持有读锁
    49  	defer m.RUnlock()
    50  
    51  	for k, v := range m.m {
    52  		if !f(k, v) {
    53  			return
    54  		}
    55  	}
    56  }