github.com/sandwich-go/boost@v1.3.29/xcontainer/syncmap/gen_int8_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 Int8String struct {
    17  	sm     sync.Map
    18  	locker sync.RWMutex
    19  }
    20  
    21  // NewSyncMap 构造函数,返回一个新的 SyncMap
    22  func NewInt8String() *Int8String {
    23  	return &Int8String{}
    24  }
    25  
    26  // Keys 获取映射中的所有键,返回一个 Key 类型的切片
    27  func (s *Int8String) Keys() (ret []int8) {
    28  	s.sm.Range(func(key, value interface{}) bool {
    29  		ret = append(ret, key.(int8))
    30  		return true
    31  	})
    32  	return ret
    33  }
    34  
    35  // Len 获取映射中键值对的数量
    36  func (s *Int8String) 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 *Int8String) Contains(key int8) (ok bool) {
    46  	_, ok = s.Load(key)
    47  	return
    48  }
    49  
    50  // Get 获取映射中的值
    51  func (s *Int8String) Get(key int8) (value string) {
    52  	value, _ = s.Load(key)
    53  	return
    54  }
    55  
    56  // Load 获取映射中的值和是否成功加载的标志
    57  func (s *Int8String) Load(key int8) (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 *Int8String) DeleteMultiple(keys ...int8) {
    66  	for _, k := range keys {
    67  		s.sm.Delete(k)
    68  	}
    69  }
    70  
    71  // Clear 清空映射
    72  func (s *Int8String) 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 *Int8String) Delete(key int8) { s.sm.Delete(key) }
    81  
    82  // Store 往映射中存储一个键值对
    83  func (s *Int8String) Store(key int8, val string) { s.sm.Store(key, val) }
    84  
    85  // LoadAndDelete 获取映射中的值,并将其从映射中删除
    86  func (s *Int8String) LoadAndDelete(key int8) (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 *Int8String) GetOrSetFuncErrorLock(key int8, cf func(key int8) (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 *Int8String) LoadOrStoreFuncErrorLock(key int8, cf func(key int8) (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 *Int8String) GetOrSetFuncLock(key int8, cf func(key int8) string) (value string, loaded bool) {
   125  	return s.LoadOrStoreFuncLock(key, cf)
   126  }
   127  
   128  // LoadOrStoreFuncLock 根据key获取对应的value,若不存在则通过cf回调创建value并存储
   129  func (s *Int8String) LoadOrStoreFuncLock(key int8, cf func(key int8) string) (value string, loaded bool) {
   130  	value, loaded, _ = s.LoadOrStoreFuncErrorLock(key, func(key int8) (string, error) {
   131  		return cf(key), nil
   132  	})
   133  	return value, loaded
   134  }
   135  
   136  // LoadOrStore 存储一个 key-value 对,若key已存在则返回已存在的value
   137  func (s *Int8String) LoadOrStore(key int8, 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 *Int8String) Range(f func(key int8, value string) bool) {
   144  	s.sm.Range(func(k, v interface{}) bool {
   145  		return f(k.(int8), v.(string))
   146  	})
   147  }
   148  
   149  // RangeDeterministic 按照 key 的顺序遍历映射中的 key-value 对,对每个 key-value 对执行给定的函数 f, f返回false则中断退出
   150  // 参数 sortableGetter 接收一个 KType 切片并返回一个可排序接口,用于对key进行排序
   151  func (s *Int8String) RangeDeterministic(f func(key int8, value string) bool, sortableGetter func([]int8) sort.Interface) {
   152  	var keys []int8
   153  	s.sm.Range(func(key, value interface{}) bool {
   154  		keys = append(keys, key.(int8))
   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 __formatKTypeToInt8String = func(i interface{}) int8 {
   169  	switch ii := i.(type) {
   170  	case int:
   171  		return int8(ii)
   172  	case int8:
   173  		return int8(ii)
   174  	case int16:
   175  		return int8(ii)
   176  	case int32:
   177  		return int8(ii)
   178  	case int64:
   179  		return int8(ii)
   180  	case uint:
   181  		return int8(ii)
   182  	case uint8:
   183  		return int8(ii)
   184  	case uint16:
   185  		return int8(ii)
   186  	case uint32:
   187  		return int8(ii)
   188  	case uint64:
   189  		return int8(ii)
   190  	case float32:
   191  		return int8(ii)
   192  	case float64:
   193  		return int8(ii)
   194  	case string:
   195  		iv, err := strconv.ParseInt(ii, 10, 64)
   196  		if err != nil {
   197  			panic(err)
   198  		}
   199  		return int8(iv)
   200  	default:
   201  		panic("unknown type")
   202  	}
   203  }
   204  
   205  //template format
   206  var __formatVTypeToInt8String = 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