golang开发-线程安全泛型(Map)
xmap - 线程安全的泛型Map库参考源代码 点击直达简介xmap是一个基于Go泛型实现的线程安全Map库提供了丰富的操作方法适用于并发场景下的键值对存储需求。通过读写锁(RWMutex)保证并发安全同时利用泛型特性支持任意可比较的键类型和任意值类型。特性线程安全使用读写锁(RWMutex)保证并发安全泛型支持支持任意可比较的键类型和任意值类型丰富API提供完整的增删改查操作方法性能优化支持初始化容量设置减少map扩容开销实用功能提供遍历、条件设置等便捷方法快速开始创建XMap实例// 创建一个初始容量为10的XMap var m xmap.New[string, int](10)基本操作// 设置键值对 m.Set(age, 25) m.Set(score, 100) // 获取值 if val, ok : m.Get(age); ok { fmt.Println(age:, val) } // 检查键是否存在 if m.Contains(name) { fmt.Println(name exists) } // 获取元素个数 fmt.Println(size:, m.Len()) // 删除键 m.Remove(score) fmt.Println(size:, m.Len()) // 清空所有元素 m.Clear() fmt.Println(size:, m.Len())类型定义XMap[K, V]泛型线程安全的Map结构体。K键类型必须实现comparable接口V值类型可以是任意类型RecordType[K, V]键值对记录类型用于返回键值对组合。type RecordType[K comparable, V any] struct { Key K Value V }构造函数New[K comparable, V any](size int) *XMap[K, V]创建指定初始容量的XMap实例。参数size初始容量用于底层map的初始化返回值*XMap[K, V]XMap实例指针核心方法Set(key K, value V)设置键值对。如果键已存在则更新对应的值。m.Set(name, 张三) m.Set(age, 30)Get(key K) (V, bool)获取指定键的值。返回值V键对应的值bool键是否存在if val, ok : m.Get(name); ok { fmt.Println(val) }Remove(key K)删除指定键及其对应的值。m.Remove(name)Clear()清空Map中的所有数据。重新分配新的map保持初始容量。m.Clear()查询方法Keys() []K返回所有键的切片。var keys m.Keys() for _, k : range keys { fmt.Println(k) }Values() []V返回所有值的切片。var values m.Values() for _, v : range values { fmt.Println(v) }Records() []*RecordType[K, V]返回所有键值对记录的切片。var records m.Records() for _, r : range records { fmt.Printf(Key: %v, Value: %v\n, r.Key, r.Value) }All() map[K]V返回底层map。注意返回的是原始map引用修改会影响内部数据。var data m.All() data[new] 100 // 会修改原始数据AllCopy() map[K]V返回底层map的副本。修改副本不会影响内部数据。var data m.AllCopy() data[new] 100 // 不会影响原始数据Len() int返回当前元素个数。size : m.Len()Contains(key K) bool检查指定键是否存在。if m.Contains(name) { fmt.Println(键存在) }实用方法GetOrSet(key K, defaultValue V) V获取指定键的值如果键不存在则设置默认值并返回。// 如果count不存在则设置为0并返回0 count : m.GetOrSet(count, 0)SetIfAbsent(key K, value V) bool如果键不存在则设置值。返回值true设置成功键不存在false设置失败键已存在if m.SetIfAbsent(name, 李四) { fmt.Println(设置成功) } else { fmt.Println(键已存在) }ForEach(fn func(key K, value V))遍历所有元素对每个键值对执行指定函数。m.ForEach(func(key string, value int) { fmt.Printf(Key: %s, Value: %d\n, key, value) })性能优化初始化容量通过New(size)指定合适的初始容量可以减少map扩容带来的性能开销读多写少场景使用读写锁多个goroutine可以同时读取返回副本AllCopy()方法返回map副本避免外部修改影响内部数据注意事项All()方法返回的map是内部数据的直接引用修改会影响原始数据迭代顺序不保证与插入顺序一致在遍历过程中ForEach不允许修改map结构增删元素