This commit is contained in:
technicianted 2020-02-11 14:18:06 -08:00
parent 46f4078530
commit 89211faa49
2 changed files with 29 additions and 0 deletions

View File

@ -135,6 +135,21 @@ func (c *cache) Get(k string) (interface{}, bool) {
return item.Object, true
}
// GetOrSet an item from the cache or sets default if not found. Returns the
// existing item or v if none was found, and a bool indicating
// whether the key was found.
func (c *cache) GetOrSet(k string, v interface{}, d time.Duration) (interface{}, bool) {
c.mu.Lock()
item, found := c.get(k)
if !found {
c.set(k, v, d)
c.mu.Unlock()
return v, false
}
c.mu.Unlock()
return item, true
}
// GetWithExpiration returns an item and its expiration time from the cache.
// It returns the item or nil, the expiration time if one is set (if the item
// never expires a zero value for time.Time is returned), and a bool indicating

View File

@ -68,6 +68,20 @@ func TestCache(t *testing.T) {
}
}
func TestGetOrSet(t *testing.T) {
tc := New(DefaultExpiration, 0)
a, found := tc.GetOrSet("a", "v", DefaultExpiration)
if found || a.(string) != "v" {
t.Error("Getting a not found value not equal to default", a)
}
a, found = tc.GetOrSet("a", "v2", DefaultExpiration)
if !found || a.(string) != "v" {
t.Error("Getting a found value not equal to original", a)
}
}
func TestCacheTimes(t *testing.T) {
var found bool