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