-
Notifications
You must be signed in to change notification settings - Fork 1
/
sync_map.go
77 lines (64 loc) · 1.69 KB
/
sync_map.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package sync
import "sync"
// Map 是 sync.Map 的封装, 但是暴露的参数类型是泛型
type Map[K comparable, V comparable] interface {
CompareAndDelete(key K, old V) (deleted bool)
CompareAndSwap(key K, old, new V) bool
Delete(key K)
Load(key K) (value V, ok bool)
LoadAndDelete(key K) (value V, loaded bool)
LoadOrStore(key K, value V) (actual V, loaded bool)
Range(f func(key K, value V) bool)
Store(key K, value V)
Swap(key K, value V) (previous V, loaded bool)
}
func NewMap[K comparable, V comparable]() Map[K, V] {
return &syncMap[K, V]{
m: &sync.Map{},
}
}
type syncMap[K comparable, V any] struct {
m *sync.Map
}
func (m *syncMap[K, V]) CompareAndDelete(key K, old V) (deleted bool) {
return m.m.CompareAndDelete(key, old)
}
func (m *syncMap[K, V]) CompareAndSwap(key K, old, new V) bool {
return m.m.CompareAndSwap(key, old, new)
}
func (m *syncMap[K, V]) Delete(key K) {
m.m.Delete(key)
}
func (m *syncMap[K, V]) Load(key K) (value V, ok bool) {
v, ok := m.m.Load(key)
if !ok {
return
}
value, ok = v.(V)
return
}
func (m *syncMap[K, V]) LoadAndDelete(key K) (value V, loaded bool) {
v, loaded := m.m.LoadAndDelete(key)
value, _ = v.(V)
return
}
func (m *syncMap[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) {
v, loaded := m.m.LoadOrStore(key, value)
actual, _ = v.(V)
return
}
func (m *syncMap[K, V]) Range(f func(key K, value V) bool) {
m.m.Range(func(key, value any) bool {
k, _ := key.(K)
v, _ := value.(V)
return f(k, v)
})
}
func (m *syncMap[K, V]) Store(key K, value V) {
m.m.Store(key, value)
}
func (m *syncMap[K, V]) Swap(key K, value V) (previous V, loaded bool) {
v, loaded := m.m.Swap(key, value)
previous, _ = v.(V)
return
}