Add Iterate

This commit is contained in:
youjianglong 2018-03-28 15:22:17 +08:00
parent a3647f8e31
commit 0dcaa59db8
1 changed files with 31 additions and 0 deletions

View File

@ -165,6 +165,37 @@ func (c *cache) GetWithExpiration(k string) (interface{}, time.Time, bool) {
return item.Object, time.Time{}, true return item.Object, time.Time{}, true
} }
// Iterate every item by item handle items from cache,and if the handle returns to false,
// it will be interrupted and return false.
func (c *cache) Iterate(f func(key string, item Item) bool) bool {
now := time.Now().UnixNano()
c.mu.RLock()
keys := make([]string, len(c.items))
i := 0
for k, v := range c.items {
// "Inlining" of Expired
if v.Expiration > 0 && now > v.Expiration {
continue
}
keys[i] = k
i++
}
c.mu.RUnlock()
keys = keys[:i]
for _, key := range keys {
c.mu.RLock()
item, ok := c.items[key]
c.mu.RUnlock()
if !ok {
continue
}
if !f(key, item) {
return false
}
}
return true
}
func (c *cache) get(k string) (interface{}, bool) { func (c *cache) get(k string) (interface{}, bool) {
item, found := c.items[k] item, found := c.items[k]
if !found { if !found {