code: func getObjectsByRangeFilter(conn redis.Conn, key string, filter string, start, end int) (objects [][]byte, err error) {
  	ids, err := redis.Values(conn.Do("ZRANGE", key, start, end))
  	if err != nil && err != redis.ErrNil {
  		return nil, err
  	}
  
  	// https://github.com/golang/go/wiki/SliceTricks#filtering-without-allocating
  	fids := ids[:0]
  	if len(ids) > 0 {
  		for _, id := range ids {
  			err := conn.Send("ZSCORE", filter, id)
  			if err != nil {
  				return nil, err
  			}
  		}
  		scores, err := redis.Strings(conn.Do(""))
  		if err != nil {
  			return nil, err
  		}
  
  		for i, score := range scores {
  			if score != "" {
  				fids = append(fids, ids[i])
  			}
  		}
  
  		objects, err = redis.ByteSlices(conn.Do("MGET", fids...))
  		if err != nil {
  			return nil, err
  		}
  	}
  	return objects, nil
  }
docs: // Return objects by a score from a zset
  // if limit is 0, all are returned
  // if end is negative, it is considered as positive infinity