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