Try to keep the translation concise and easy to understand.

Golang RabbitMQ w trybie tematycznym jest podobny do trybu routingu (Direct), z największą różnicą polegającą na tym, że parametry routingu w trybie tematycznym obsługują dopasowanie rozmyte. Typ wymiany dla trybu tematycznego to „topic”.

Architektura trybu tematycznego przedstawia się następująco: RabbitMQ Tryb Tematyczny

Uwaga: Jeśli nie jesteś zaznajomiony z trybem tematycznym RabbitMQ, prosimy przeczytać najpierw sekcję Tryb tematyczny RabbitMQ.

1. Samouczek Wstępny

Prosimy zapoznać się z poniższymi sekcjami w kolejności:

Uwaga: Ponieważ sekcja dotycząca wzorca publikuj/subskrybuj w Golang RabbitMQ zawiera już kompletne przykłady kodu, różnice dotyczą jedynie definicji wymiany i parametrów routingu dla innych trybów RabbitMQ. Dlatego pokazany jest tylko kluczowy kod.

2. Deklaracja Wymiany Tematycznej

err = ch.ExchangeDeclare(
  "tizi365_topic", // Nazwa wymiany, musi być unikalna
  "topic",         // Typ wymiany
  true,            // Trwała
  false,           // Auto-usunięcie
  false,           // Wewnętrzna
  false,           // Bez oczekiwania
  nil,             // Argumenty
)

3. Wysyłanie Wiadomości

    // Treść wiadomości
    body := "Witaj Tizi365.com!"

    // Wysłanie wiadomości
    err = ch.Publish(
        "tizi365_topic",      // Nazwa wymiany
        "www.tizi365.com",    // Parametr routingu, kluczowy parametr decydujący, do jakiej kolejki zostanie wysłana twoja wiadomość
        false,                // Obowiązkowa
        false,                // Natychmiastowa
        amqp.Publishing {
            ContentType: "text/plain", // Typ zawartości wiadomości, tutaj jest to zwykły tekst
            Body:        []byte(body),  // Treść wiadomości
        })

4. Konsumowanie Wiadomości

4.1. Wiązanie Wymiany

// Deklaracja kolejki, na której będzie wykonywana operacja
    q, err := ch.QueueDeclare(
        "",    // Nazwa kolejki, zostanie losowo wygenerowana, jeśli nie zostanie uzupełniona
        false, // Trwała kolejka
        false, // Usunięcie, gdy nieużywana
        true,  // Wyłączna
        false, // Bez oczekiwania
        nil,   // Argumenty
    )

    // Wiązanie kolejki z określoną wymianą
    err = ch.QueueBind(
        q.Name,             // Nazwa kolejki
        "*.tizi365.com",    // Parametr routingu, kluczowy parametr, używając symbolu * do dopasowania jednego słowa, jeśli użyty zostanie #, można dopasować kilka słów
        "tizi365_topic",    // Nazwa wymiany, musi pasować do wymiany zdefiniowanej przez nadawcę wiadomości
        false,
        nil)

4.2. Obsługa Wiadomości

// Utworzenie konsumenta
    msgs, err := ch.Consume(
        q.Name, // Odniesienie do nazwy kolejki powyżej
        "",     // Nazwa konsumenta, automatycznie generowana, jeśli nie zostanie uzupełniona
        true,   // Automatyczne potwierdzenie kolejce, że wiadomość została obsłużona
        false,  // Wyłączna
        false,  // Brak lokalnej
        false,  // Bez oczekiwania
        nil,    // Argumenty
    )

    // Przejście przez konsumowanie wiadomości w kolejce
    for d := range msgs {
        log.Printf("Otrzymano wiadomość=%s", d.Body)
    }