]> 127.0.0.1 Git - part/.git/commitdiff
1 v0.28.20240501064531
authorqydysky <qydysky@foxmail.com>
Wed, 1 May 2024 06:39:46 +0000 (06:39 +0000)
committerqydysky <qydysky@foxmail.com>
Wed, 1 May 2024 06:39:46 +0000 (06:39 +0000)
sync/Map.go
sync/Map_test.go

index 18ef018b9881db3eabea617512a3c2356092e52a..abc0589fbd7f8685f1caa8022ab4e5609c6714a5 100644 (file)
@@ -84,6 +84,17 @@ type mapExceededItem[V any] struct {
        wait     sync.RWMutex
 }
 
+func (t *MapExceeded[K, V]) Copy() (m *MapExceeded[K, V]) {
+       m = &MapExceeded[K, V]{}
+       t.m.Range(func(key, value any) bool {
+               if value.(*mapExceededItem[V]).exceeded.After(time.Now()) {
+                       m.m.Store(key, value)
+               }
+               return true
+       })
+       return
+}
+
 func (t *MapExceeded[K, V]) Store(k K, v *V, dur time.Duration) {
        t.m.Store(k, &mapExceededItem[V]{
                data:     v,
index ef821ec6844560a7b5624ce7d565598d6cdb7fed..57542735cff7c772000ef01ef29966e3e73526e2 100644 (file)
@@ -373,3 +373,22 @@ func TestMapExceeded2(t *testing.T) {
        }
        w.Wait()
 }
+
+func TestMapExceeded3(t *testing.T) {
+       var m MapExceeded[string, []byte]
+       var data = []byte("1")
+       if v, loaded, f := m.LoadOrStore("1"); v != nil || loaded {
+               t.Fatal()
+       } else {
+               f(&data, time.Second)
+               if v, ok := m.Load("1"); !ok || v == nil || !bytes.Equal(data, *v) {
+                       t.Fatal()
+               }
+       }
+
+       p := m.Copy()
+
+       if v, ok := p.Load("1"); !ok || v == nil || !bytes.Equal(data, *v) {
+               t.Fatal()
+       }
+}