Si se debe crear una conexión cada vez que amqp.Dial es seguro o no en go lang

Como se menciona en los documentos de RabbitMQ, las conexiones tcp son caras de hacer. Entonces, para ese concepto de canal se introdujo. Ahora me encontré con estoejemplo. En elmain() crea la conexión cada vez que se publica un mensaje.conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/"). ¿No debería declararse globalmente una vez y debería haber un mecanismo de conmutación por error en caso de que la conexión se cierre como un objeto singleton? Si amqp.Dial es seguro para subprocesos, lo que supongo que debería ser

Pregunta editada:

Estoy manejando el error de conexión de la siguiente manera. En el que escucho en un canal y creo una nueva conexión por error. Pero cuando elimino la conexión existente e intento publicar el mensaje. Obtuve el siguiente error.

error:

2016/03/30 19:20:08 Failed to open a channel: write tcp 172.16.5.48:51085->172.16.0.20:5672: use of closed network connection
exit status 1
7:25 PM

Código:

 func main() {

        Conn, err := amqp.Dial("amqp://guest:[email protected]:5672/")
        failOnError(err, "Failed to connect to RabbitMQ")
         context := &appContext{queueName: "QUEUENAME",exchangeName: "ExchangeName",exchangeType: "direct",routingKey: "RoutingKey",conn: Conn}
        c := make(chan *amqp.Error)

        go func() {
            error := <-c
            if(error != nil){                
                Conn, err = amqp.Dial("amqp://guest:[email protected]:5672/")            
                failOnError(err, "Failed to connect to RabbitMQ")            
                Conn.NotifyClose(c)                                           
            }            
        }()

        Conn.NotifyClose(c)
        r := web.New()
        // We pass an instance to our context pointer, and our handler.
        r.Get("/", appHandler{context, IndexHandler})
        graceful.ListenAndServe(":8086", r)  

    }

Respuestas a la pregunta(1)

Su respuesta a la pregunta