github.com/sandwich-go/boost@v1.3.29/xcontainer/syncmap/gen_any_any.go (about) 1 // Code generated by gotemplate. DO NOT EDIT. 2 3 // syncmap 提供了一个同步的映射实现,允许安全并发的访问 4 package syncmap 5 6 import ( 7 "sort" 8 "sync" 9 ) 10 11 //template type SyncMap(KType,VType) 12 13 // SyncMap 定义并发安全的映射,使用 sync.Map 来实现 14 type AnyAny struct { 15 sm sync.Map 16 locker sync.RWMutex 17 } 18 19 // NewSyncMap 构造函数,返回一个新的 SyncMap 20 func NewAnyAny() *AnyAny { 21 return &AnyAny{} 22 } 23 24 // Keys 获取映射中的所有键,返回一个 Key 类型的切片 25 func (s *AnyAny) Keys() (ret []interface{}) { 26 s.sm.Range(func(key, value interface{}) bool { 27 ret = append(ret, key.(interface{})) 28 return true 29 }) 30 return ret 31 } 32 33 // Len 获取映射中键值对的数量 34 func (s *AnyAny) Len() (c int) { 35 s.sm.Range(func(key, value interface{}) bool { 36 c++ 37 return true 38 }) 39 return c 40 } 41 42 // Contains 检查映射中是否包含指定键 43 func (s *AnyAny) Contains(key interface{}) (ok bool) { 44 _, ok = s.Load(key) 45 return 46 } 47 48 // Get 获取映射中的值 49 func (s *AnyAny) Get(key interface{}) (value interface{}) { 50 value, _ = s.Load(key) 51 return 52 } 53 54 // Load 获取映射中的值和是否成功加载的标志 55 func (s *AnyAny) Load(key interface{}) (value interface{}, loaded bool) { 56 if v, ok := s.sm.Load(key); ok { 57 return v.(interface{}), true 58 } 59 return 60 } 61 62 // DeleteMultiple 删除映射中的多个键 63 func (s *AnyAny) DeleteMultiple(keys ...interface{}) { 64 for _, k := range keys { 65 s.sm.Delete(k) 66 } 67 } 68 69 // Clear 清空映射 70 func (s *AnyAny) Clear() { 71 s.sm.Range(func(key, value interface{}) bool { 72 s.sm.Delete(key) 73 return true 74 }) 75 } 76 77 // Delete 删除映射中的值 78 func (s *AnyAny) Delete(key interface{}) { s.sm.Delete(key) } 79 80 // Store 往映射中存储一个键值对 81 func (s *AnyAny) Store(key interface{}, val interface{}) { s.sm.Store(key, val) } 82 83 // LoadAndDelete 获取映射中的值,并将其从映射中删除 84 func (s *AnyAny) LoadAndDelete(key interface{}) (value interface{}, loaded bool) { 85 if v, ok := s.sm.LoadAndDelete(key); ok { 86 return v.(interface{}), true 87 } 88 return 89 } 90 91 // GetOrSetFuncErrorLock 函数根据key查找值,如果key存在则返回对应的值,否则用cf函数计算得到一个新的值,存储到 SyncMap 中并返回。 92 // 如果执行cf函数时出错,则返回error。 93 // 函数内部使用读写锁实现并发安全 94 func (s *AnyAny) GetOrSetFuncErrorLock(key interface{}, cf func(key interface{}) (interface{}, error)) (value interface{}, loaded bool, err error) { 95 return s.LoadOrStoreFuncErrorLock(key, cf) 96 } 97 98 // LoadOrStoreFuncErrorLock 函数根据key查找值,如果key存在则返回对应的值,否则用cf函数计算得到一个新的值,存储到 SyncMap 中并返回。 99 // 如果执行cf函数时出错,则返回error。 100 // 函数内部使用读写锁实现并发安全 101 func (s *AnyAny) LoadOrStoreFuncErrorLock(key interface{}, cf func(key interface{}) (interface{}, error)) (value interface{}, loaded bool, err error) { 102 if v, ok := s.Load(key); ok { 103 return v, true, nil 104 } 105 // 如果不存在,则加写锁,再次查找,如果获取到则直接返回 106 s.locker.Lock() 107 defer s.locker.Unlock() 108 // 再次重试,如果获取到则直接返回 109 if v, ok := s.Load(key); ok { 110 return v, true, nil 111 } 112 // 如果还是不存在,则执行cf函数计算出value,并存储到 SyncMap 中 113 value, err = cf(key) 114 if err != nil { 115 return value, false, err 116 } 117 s.Store(key, value) 118 return value, false, nil 119 } 120 121 // GetOrSetFuncLock 根据key获取对应的value,若不存在则通过cf回调创建value并存储 122 func (s *AnyAny) GetOrSetFuncLock(key interface{}, cf func(key interface{}) interface{}) (value interface{}, loaded bool) { 123 return s.LoadOrStoreFuncLock(key, cf) 124 } 125 126 // LoadOrStoreFuncLock 根据key获取对应的value,若不存在则通过cf回调创建value并存储 127 func (s *AnyAny) LoadOrStoreFuncLock(key interface{}, cf func(key interface{}) interface{}) (value interface{}, loaded bool) { 128 value, loaded, _ = s.LoadOrStoreFuncErrorLock(key, func(key interface{}) (interface{}, error) { 129 return cf(key), nil 130 }) 131 return value, loaded 132 } 133 134 // LoadOrStore 存储一个 key-value 对,若key已存在则返回已存在的value 135 func (s *AnyAny) LoadOrStore(key interface{}, val interface{}) (interface{}, bool) { 136 actual, ok := s.sm.LoadOrStore(key, val) 137 return actual.(interface{}), ok 138 } 139 140 // Range 遍历映射中的 key-value 对,对每个 key-value 对执行给定的函数f 141 func (s *AnyAny) Range(f func(key interface{}, value interface{}) bool) { 142 s.sm.Range(func(k, v interface{}) bool { 143 return f(k.(interface{}), v.(interface{})) 144 }) 145 } 146 147 // RangeDeterministic 按照 key 的顺序遍历映射中的 key-value 对,对每个 key-value 对执行给定的函数 f, f返回false则中断退出 148 // 参数 sortableGetter 接收一个 KType 切片并返回一个可排序接口,用于对key进行排序 149 func (s *AnyAny) RangeDeterministic(f func(key interface{}, value interface{}) bool, sortableGetter func([]interface{}) sort.Interface) { 150 var keys []interface{} 151 s.sm.Range(func(key, value interface{}) bool { 152 keys = append(keys, key.(interface{})) 153 return true 154 }) 155 sort.Sort(sortableGetter(keys)) 156 for _, k := range keys { 157 if v, ok := s.Load(k); ok { 158 if !f(k, v) { 159 break 160 } 161 } 162 } 163 } 164 165 //template format 166 var __formatKTypeToAnyAny = func(i interface{}) interface{} { 167 return i 168 } 169 170 //template format 171 var __formatVTypeToAnyAny = func(i interface{}) interface{} { 172 return i 173 } 174 175 // add 6,6 success 176 177 // add 7, 7 failed 178 179 // add 7, 7 success