code: func (c *Cache) GetOrCreate(key string, create func() (interface{}, error)) (interface{}, error) {
  	c.mu.RLock()
  	entry, found := c.cache[key]
  	c.mu.RUnlock()
  
  	if found {
  		return entry.value, entry.err
  	}
  
  	c.nlocker.Lock(key)
  	defer c.nlocker.Unlock(key)
  
  	// Create it.
  	value, err := create()
  
  	c.mu.Lock()
  	c.cache[key] = cacheEntry{value: value, err: err}
  	c.mu.Unlock()
  
  	return value, err
  }
docs: // GetOrCreate tries to get the value with the given cache key, if not found
  // create will be called and cached.
  // This method is thread safe. It also guarantees that the create func for a given
  // key is invoced only once for this cache.