package beegoimport ( errors fmt strconv sync time)var ( defaultevery int = 60 // 1 minute)type beeitem struct { val interface{} lastaccess time.time expired int}func (itm *beeitem) access() interface{} { itm.lastaccess = time.now() return itm.val}type beecache struct { lock sync.rwmutex dur time.duration items map[string]*beeitem every int // run an expiration check every seconds}// newdefaultcache returns a new filecache with sane defaults.func newbeecache() *beecache { cache := beecache{dur: time.since(time.now()), every: defaultevery} return &cache}func (bc *beecache) get(name string) interface{} { bc.lock.rlock() defer bc.lock.runlock() itm, ok := bc.items[name] if !ok { return nil } return itm.access()}func (bc *beecache) put(name string, value interface{}, expired int) error { bc.lock.lock() defer bc.lock.unlock() t := beeitem{val: value, lastaccess: time.now(), expired: expired} if _, ok := bc.items[name]; ok { return errors.new(the key is exist) } else { bc.items[name] = &t } return nil}func (bc *beecache) delete(name string) (ok bool, err error) { bc.lock.lock() defer bc.lock.unlock() if _, ok = bc.items[name]; !ok { return } delete(bc.items, name) _, valid := bc.items[name] if valid { ok = false } return}func (bc *beecache) isexist(name string) bool { bc.lock.rlock() defer bc.lock.runlock() _, ok := bc.items[name] return ok}// start activates the file cache; it will func (bc *beecache) start() error { dur, err := time.parseduration(fmt.sprintf(%ds, bc.every)) if err != nil { return err } bc.dur = dur bc.items = make(map[string]*beeitem, 0) go bc.vaccuum() return nil}func (bc *beecache) vaccuum() { if bc.every < 1 { return } for { = itm.expired { delete(bc.items, name) return true } return false}