code: func (c *Cacher) Get(ctx context.Context, key string, resourceVersion string, objPtr runtime.Object, ignoreNotFound bool) error {
  	if resourceVersion == "" {
  		// If resourceVersion is not specified, serve it from underlying
  		// storage (for backward compatibility).
  		return c.storage.Get(ctx, key, resourceVersion, objPtr, ignoreNotFound)
  	}
  
  	// If resourceVersion is specified, serve it from cache.
  	// It's guaranteed that the returned value is at least that
  	// fresh as the given resourceVersion.
  	getRV, err := c.versioner.ParseResourceVersion(resourceVersion)
  	if err != nil {
  		return err
  	}
  
  	if getRV == 0 && !c.ready.check() {
  		// If Cacher is not yet initialized and we don't require any specific
  		// minimal resource version, simply forward the request to storage.
  		return c.storage.Get(ctx, key, resourceVersion, objPtr, ignoreNotFound)
  	}
  
  	// Do not create a trace - it's not for free and there are tons
  	// of Get requests. We can add it if it will be really needed.
  	c.ready.wait()
  
  	objVal, err := conversion.EnforcePtr(objPtr)
  	if err != nil {
  		return err
  	}
  
  	obj, exists, readResourceVersion, err := c.watchCache.WaitUntilFreshAndGet(getRV, key, nil)
  	if err != nil {
  		return err
  	}
  
  	if exists {
  		elem, ok := obj.(*storeElement)
  		if !ok {
  			return fmt.Errorf("non *storeElement returned from storage: %v", obj)
  		}
  		objVal.Set(reflect.ValueOf(elem.Object).Elem())
  	} else {
  		objVal.Set(reflect.Zero(objVal.Type()))
  		if !ignoreNotFound {
  			return storage.NewKeyNotFoundError(key, int64(readResourceVersion))
  		}
  	}
  	return nil
  }
docs: // Get implements storage.Interface.