sync: implement map.LoadAndDelete
Этот коммит содержится в:
родитель
e09bd5abb3
коммит
623dd6a815
2 изменённых файлов: 30 добавлений и 0 удалений
|
@ -34,6 +34,17 @@ func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bo
|
||||||
return value, false
|
return value, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Map) LoadAndDelete(key interface{}) (value interface{}, loaded bool) {
|
||||||
|
m.lock.Lock()
|
||||||
|
defer m.lock.Unlock()
|
||||||
|
value, ok := m.m[key]
|
||||||
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
delete(m.m, key)
|
||||||
|
return value, true
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Map) Store(key, value interface{}) {
|
func (m *Map) Store(key, value interface{}) {
|
||||||
m.lock.Lock()
|
m.lock.Lock()
|
||||||
defer m.lock.Unlock()
|
defer m.lock.Unlock()
|
||||||
|
|
19
src/sync/map_test.go
Обычный файл
19
src/sync/map_test.go
Обычный файл
|
@ -0,0 +1,19 @@
|
||||||
|
package sync_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMapLoadAndDelete(t *testing.T) {
|
||||||
|
var sm sync.Map
|
||||||
|
sm.Store("present", "value")
|
||||||
|
|
||||||
|
if v, ok := sm.LoadAndDelete("present"); !ok || v != "value" {
|
||||||
|
t.Errorf("LoadAndDelete returned %v, %v, want value, true", v, ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, ok := sm.LoadAndDelete("absent"); ok || v != nil {
|
||||||
|
t.Errorf("LoadAndDelete returned %v, %v, want nil, false", v, ok)
|
||||||
|
}
|
||||||
|
}
|
Загрузка…
Создание таблицы
Сослаться в новой задаче