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 }