func (c *Client) Init() error {
	c.ac.tlsConfig = c.TLSConfig
	if err := c.ac.init(); err != nil {
		return err
	}
	return c.setup()
}
Init initializes the Client object. It establishes the connection with the
broker, creating a channel and the queues that will be used under the hood.
package rpcmq
import (
	"crypto/tls"
	"encoding/json"
	"errors"
	"fmt"
	"time"
	"github.com/streadway/amqp"
)
type Client struct {
	msgsName     string
	repliesName  string
	exchangeName string
	exchangeKind string
	ac           *amqpClient
	msgsQueue    amqp.Queue
	repliesQueue amqp.Queue
	mandatory    bool
	deliveries   <-chan amqp.Delivery
	results      chan Result
	DeliveryMode DeliveryMode
	TLSConfig *tls.Config
}
type Result struct {
	UUID string
	Data []byte
	Err  string
}
type rpcMsg struct {
	Method string
	Data   []byte
}
func NewClient(uri, msgsQueue, repliesQueue, exchange, kind string) *Client {
	var mandatory bool
	if kind == "fanout" {
		msgsQueue = ""  
		mandatory = false
	} else {
		mandatory = true
	}
	c := &Client{
		msgsName:     msgsQueue,
		repliesName:  repliesQueue,
		exchangeName: exchange,
		exchangeKind: kind,
		mandatory:    mandatory,
		ac:           newAmqpClient(uri),
		results:      make(chan Result),
		DeliveryMode: Persistent,
	}
	c.ac.setupFunc = c.setup
	return c
}