O modo Tópico do RabbitMQ em Golang é semelhante ao modo de roteamento (Direto), com a maior diferença sendo que os parâmetros de roteamento no modo de tópico suportam correspondência difusa. O tipo de troca para o modo tópico é 'tópico'.

A arquitetura do modo tópico é a seguinte: RabbitMQ Modo Tópico

Nota: Se não estiver familiarizado com o modo tópico do RabbitMQ, por favor leia primeiro a seção Modo Tópico do RabbitMQ.

1. Tutorial Pré-requisito

Por favor, leia as seguintes seções em ordem:

Nota: Porque a seção de publicação/assinatura do RabbitMQ em Golang já contém exemplos de código completos, apenas a definição da troca e os parâmetros de roteamento são diferentes para outros modos do RabbitMQ. Portanto, apenas o código-chave é mostrado.

2. Declarando Troca de Tópico

err = ch.ExchangeDeclare(
  "tizi365_topic", // Nome da troca, precisa ser único
  "topic",         // Tipo de troca
  true,            // Durável
  false,           // Auto-excluir
  false,           // Interno
  false,           // Sem espera
  nil,             // Argumentos
)

3. Enviando Mensagens

    // Conteúdo da mensagem
    body := "Olá Tizi365.com!"

    // Publicar mensagem
    err = ch.Publish(
        "tizi365_topic",      // Nome da troca
        "www.tizi365.com",    // Parâmetro de roteamento, parâmetro crucial que determina a qual fila sua mensagem será enviada
        false,                // Obrigatório
        false,                // Imediato
        amqp.Publishing {
            ContentType: "text/plain", // Tipo de conteúdo da mensagem, aqui é texto simples
            Body:        []byte(body),  // Conteúdo da mensagem
        })

4. Consumindo Mensagens

4.1. Vinculando Troca

// Declarar a fila a ser operada
    q, err := ch.QueueDeclare(
        "",    // Nome da fila, será gerado aleatoriamente se não preenchido
        false, // Fila durável
        false, // Excluir quando não utilizada
        true,  // Exclusiva
        false, // Sem espera
        nil,   // Argumentos
    )

    // Vincular a fila à troca especificada
    err = ch.QueueBind(
        q.Name,             // Nome da fila
        "*.tizi365.com",    // Parâmetro de roteamento, parâmetro crucial, usando o curinga * para combinar uma palavra, se # for usado, pode combinar várias palavras
        "tizi365_topic",    // Nome da troca, precisa corresponder à troca definida pelo remetente da mensagem
        false,
        nil)

4.2. Lidando com Mensagens

// Criar um consumidor
    msgs, err := ch.Consume(
        q.Name, // Referência ao nome da fila acima
        "",     // Nome do consumidor, gerado automaticamente se não preenchido
        true,   // Reconhecimento automático para a fila de que a mensagem foi tratada
        false,  // Exclusivo
        false,  // Não local
        false,  // Sem espera
        nil,    // Args
    )

    // Iterar através do consumo de mensagens na fila
    for d := range msgs {
        log.Printf("Mensagem recebida=%s", d.Body)
    }