code: func DeleteMulti(c context.Context, keys []*datastore.Key) error {
  
  	callCount := (len(keys)-1)/deleteMultiLimit + 1
  	errs := make([]error, callCount)
  
  	var wg sync.WaitGroup
  	wg.Add(callCount)
  	for i := 0; i < callCount; i++ {
  		lo := i * deleteMultiLimit
  		hi := (i + 1) * deleteMultiLimit
  		if hi > len(keys) {
  			hi = len(keys)
  		}
  
  		go func(i int, keys []*datastore.Key) {
  			errs[i] = deleteMulti(c, keys)
  			wg.Done()
  		}(i, keys[lo:hi])
  	}
  	wg.Wait()
  
  	if isErrorsNil(errs) {
  		return nil
  	}
  
  	return groupErrors(errs, len(keys), deleteMultiLimit)
  }
docs: // DeleteMulti works just like datastore.DeleteMulti except it maintains
  // cache consistency with other NDS methods. It also removes the API limit of
  // 500 entities per request by calling the datastore as many times as required
  // to put all the keys. It does this efficiently and concurrently.