package main import ( "sync" "time" ) type CachedArticle struct { Article *Article CacheTime time.Time } type IndexCache struct { sync.RWMutex Cache map[string]*CachedArticle } func NewIndexCache() *IndexCache { return &IndexCache{Cache: make(map[string]*CachedArticle)} } func (ic IndexCache) Add(title string, a *Article) { now := time.Now() ic.Lock() defer ic.Unlock() c, ok := ic.Cache[title] if ok && now.After(c.CacheTime) { c.Article = a c.CacheTime = now ic.Cache[title] = c return } ic.Cache[title] = &CachedArticle{a, now} } func (ic IndexCache) Get(title string) *Article { ic.RLock() defer ic.RUnlock() if a, ok := ic.Cache[title]; ok { return a.Article } return nil } func (ic *IndexCache) Delete(title string) { ic.Lock() delete(ic.Cache, title) ic.Unlock() }