diff --git a/expiry-map.go b/expiry-map.go index a36d1e1..f3992a2 100644 --- a/expiry-map.go +++ b/expiry-map.go @@ -40,16 +40,17 @@ func New[K comparable, V any](expiryDelay, gargabeCleanInterval time.Duration) * } // Get returns the value for a given key. -func (s *ExpiryMap[K, V]) Get(key K) V { +func (s *ExpiryMap[K, V]) Get(key K) (V, bool) { s.mutex.Lock() defer s.mutex.Unlock() content, found := s.storedMap[key] + if !found { content = &Content[V]{} } - return content.Data + return content.Data, found } // Set sets the value for a given key and reset its expiry time. diff --git a/expiry-map_test.go b/expiry-map_test.go index 3161bc4..110e803 100644 --- a/expiry-map_test.go +++ b/expiry-map_test.go @@ -18,9 +18,14 @@ func TestGetUnset(t *testing.T) { m := New[int, string](time.Minute, time.Minute) - if v := m.Get(key); !reflect.DeepEqual(v, "") { + v, found := m.Get(key) + if !reflect.DeepEqual(v, "") { t.Fatalf("expected %v, got %v", "", v) } + + if found { + t.Fatalf("expected %v, got %v", false, found) + } } func TestSetGet(t *testing.T) { @@ -30,7 +35,7 @@ func TestSetGet(t *testing.T) { m := New[int, string](time.Minute, time.Minute) m.Set(key, value) - if v := m.Get(key); !reflect.DeepEqual(v, value) { + if v, _ := m.Get(key); !reflect.DeepEqual(v, value) { t.Fatalf("expected %v, got %v", value, v) } } @@ -43,7 +48,7 @@ func TestSetDeleteGet(t *testing.T) { m.Set(key, value) m.Delete(key) - if v := m.Get(key); !reflect.DeepEqual(v, "") { + if v, _ := m.Get(key); !reflect.DeepEqual(v, "") { t.Fatalf("expected %v, got %v", "", v) } } @@ -124,13 +129,13 @@ func TestGargabeClean(t *testing.T) { m := New[int, string](time.Nanosecond, time.Millisecond) m.Set(key, value) - if v := m.Get(key); !reflect.DeepEqual(v, value) { + if v, _ := m.Get(key); !reflect.DeepEqual(v, value) { t.Fatalf("expected %v, got %v", value, v) } time.Sleep(time.Millisecond * 2) - if v := m.Get(key); v != "" { + if v, _ := m.Get(key); v != "" { t.Fatalf("expected nil, got %v", v) } }