code: func (c *RPCClient) Query(params *QueryParam) error {
  	// Setup the request
  	seq := c.getSeq()
  	header := requestHeader{
  		Command: queryCommand,
  		Seq:     seq,
  	}
  	req := queryRequest{
  		FilterNodes: params.FilterNodes,
  		FilterTags:  params.FilterTags,
  		RequestAck:  params.RequestAck,
  		RelayFactor: params.RelayFactor,
  		Timeout:     params.Timeout,
  		Name:        params.Name,
  		Payload:     params.Payload,
  	}
  
  	// Create a query handler
  	initCh := make(chan error, 1)
  	handler := &queryHandler{
  		client: c,
  		initCh: initCh,
  		ackCh:  params.AckCh,
  		respCh: params.RespCh,
  		seq:    seq,
  	}
  	c.handleSeq(seq, handler)
  
  	// Send the request
  	if err := c.send(&header, &req); err != nil {
  		c.deregisterHandler(seq)
  		return err
  	}
  
  	// Wait for a response
  	select {
  	case err := <-initCh:
  		return err
  	case <-c.shutdownCh:
  		c.deregisterHandler(seq)
  		return clientClosed
  	}
  }
docs: // Query initiates a new query message using the given parameters, and streams
  // acks and responses over the given channels. The channels will not block on
  // sends and should be buffered. At the end of the query, the channels will be
  // closed.