code: func Lookup(ctx context.Context, address string) ([]Rect, error) {
  	if AltLookupFn != nil {
  		return AltLookupFn(ctx, address)
  	}
  
  	mu.RLock()
  	rects, ok := cache[address]
  	mu.RUnlock()
  	if ok {
  		return rects, nil
  	}
  
  	key, err := GetAPIKey()
  	if err != nil {
  		return nil, err
  	}
  
  	rectsi, err := sf.Do(address, func() (interface{}, error) {
  		// TODO: static data files from OpenStreetMap, Wikipedia, etc?
  		urlStr := "https://maps.googleapis.com/maps/api/geocode/json?address=" + url.QueryEscape(address) + "&sensor=false&key=" + url.QueryEscape(key)
  		res, err := ctxhttp.Get(ctx, ctxutil.Client(ctx), urlStr)
  		if err != nil {
  			log.Printf("geocode: HTTP error doing Google lookup: %v", err)
  			return nil, err
  		}
  		defer res.Body.Close()
  		rects, err := decodeGoogleResponse(res.Body)
  		if err != nil {
  			log.Printf("geocode: error decoding Google geocode response for %q: %v", address, err)
  		} else {
  			log.Printf("geocode: Google lookup (%q) = %#v", address, rects)
  		}
  		if err == nil {
  			mu.Lock()
  			cache[address] = rects
  			mu.Unlock()
  		}
  		return rects, err
  	})
  	if err != nil {
  		return nil, err
  	}
  	return rectsi.([]Rect), nil
  }
docs: // Lookup returns rectangles for the given address. Currently the only
  // implementation is the Google geocoding service.