Skip to content

Commit d4888e5

Browse files
aykevldeadprogram
authored andcommitted
sync: implement sync.Swap
1 parent 84637cc commit d4888e5

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/sync/map.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,15 @@ func (m *Map) Range(f func(key, value interface{}) bool) {
7070
}
7171
}
7272
}
73+
74+
// Swap replaces the value for the given key, and returns the old value if any.
75+
func (m *Map) Swap(key, value any) (previous any, loaded bool) {
76+
m.lock.Lock()
77+
defer m.lock.Unlock()
78+
if m.m == nil {
79+
m.m = make(map[interface{}]interface{})
80+
}
81+
previous, loaded = m.m[key]
82+
m.m[key] = value
83+
return
84+
}

src/sync/map_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,22 @@ func TestMapLoadAndDelete(t *testing.T) {
1717
t.Errorf("LoadAndDelete returned %v, %v, want nil, false", v, ok)
1818
}
1919
}
20+
21+
func TestMapSwap(t *testing.T) {
22+
var sm sync.Map
23+
sm.Store("present", "value")
24+
25+
if v, ok := sm.Swap("present", "value2"); !ok || v != "value" {
26+
t.Errorf("Swap returned %v, %v, want value, true", v, ok)
27+
}
28+
if v, ok := sm.Load("present"); !ok || v != "value2" {
29+
t.Errorf("Load after Swap returned %v, %v, want value2, true", v, ok)
30+
}
31+
32+
if v, ok := sm.Swap("new", "foo"); ok || v != nil {
33+
t.Errorf("Swap returned %v, %v, want nil, false", v, ok)
34+
}
35+
if v, ok := sm.Load("present"); !ok || v != "value2" {
36+
t.Errorf("Load after Swap returned %v, %v, want foo, true", v, ok)
37+
}
38+
}

0 commit comments

Comments
 (0)