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