From 7a0d6d955615d312c75a2b0f520a8b7f27eaa423 Mon Sep 17 00:00:00 2001 From: 1 <1@72wo.cn> Date: Fri, 25 Jul 2025 03:15:45 +0000 Subject: [PATCH] =?UTF-8?q?feat(utils):=20=E6=96=B0=E5=A2=9E=E6=B3=9B?= =?UTF-8?q?=E5=9E=8BSyncMap=E5=AE=9E=E7=8E=B0=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=E7=9A=84=E9=94=AE=E5=80=BC?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=92=8C=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/utils/syncmap.go | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 common/utils/syncmap.go diff --git a/common/utils/syncmap.go b/common/utils/syncmap.go new file mode 100644 index 000000000..3c7c7619b --- /dev/null +++ b/common/utils/syncmap.go @@ -0,0 +1,64 @@ +package utils + +import ( + "fmt" + "sync" +) + +// 定义一个泛型的 SyncMap,支持任意类型的键和值 +type SyncMap[K comparable, V any] struct { + m sync.Map +} + +// 设置键值对 +func (sm *SyncMap[K, V]) Store(key K, value V) { + sm.m.Store(key, value) +} + +// 获取键对应的值 +func (sm *SyncMap[K, V]) Load(key K) (V, bool) { + val, ok := sm.m.Load(key) + if ok { + return val.(V), true + } + var zeroValue V + return zeroValue, false +} + +// 删除键值对 +func (sm *SyncMap[K, V]) Delete(key K) { + sm.m.Delete(key) +} + +// 遍历所有键值对 +func (sm *SyncMap[K, V]) Range(f func(key K, value V) bool) { + sm.m.Range(func(key, value any) bool { + return f(key.(K), value.(V)) + }) +} + +func main() { + // 使用 SyncMap 存储字符串 -> int 类型的键值对 + sm1 := &SyncMap[string, int]{} + sm1.Store("apple", 5) + sm1.Store("banana", 10) + + // 加载并打印值 + if value, ok := sm1.Load("apple"); ok { + fmt.Println("apple:", value) + } + if value, ok := sm1.Load("banana"); ok { + fmt.Println("banana:", value) + } + + // 使用 SyncMap 存储 int -> string 类型的键值对 + sm2 := &SyncMap[int, string]{} + sm2.Store(1, "one") + sm2.Store(2, "two") + + // 遍历所有键值对 + sm2.Range(func(key int, value string) bool { + fmt.Printf("%d: %s\n", key, value) + return true + }) +} \ No newline at end of file