package weather import ( "sync" "time" ) type cacheEntry struct { data *WeatherResult expiresAt time.Time } type Cache struct { mu sync.Mutex ttl time.Duration items map[string]cacheEntry } func NewCache(ttl time.Duration) *Cache { return &Cache{ttl: ttl, items: make(map[string]cacheEntry)} } func (c *Cache) Get(key string) (*WeatherResult, bool) { c.mu.Lock() defer c.mu.Unlock() e, ok := c.items[key] if !ok { return nil, false } if time.Now().After(e.expiresAt) { delete(c.items, key) return nil, false } return e.data, true } func (c *Cache) Set(key string, data *WeatherResult) { c.mu.Lock() defer c.mu.Unlock() c.items[key] = cacheEntry{data: data, expiresAt: time.Now().Add(c.ttl)} }