Skip to main content

Go Client

The Paho Go Client provides an MQTT client library for connection to MQTT brokers via TCP, TLS or WebSockets




Once you have installed Go and configured your environment you can install the Paho Go client by running;

go get


API documentation for the Paho Go client is available at Alternatively, once you have downloaded the src via go get you can run godoc -http=":6060" and navigate to http://localhost:6060 to browse the documentation locally

Getting Started

The client can connect to a broker using TCP, TLS or a WebSocket connection. Ensure the broker you're using supports the connection type you wish to use.

The type of connection required is specified by the scheme of the connection URL set in the ClientOptions struct, for example:

  • tcp:// - connect to on port 1883 using plain TCP
  • ws:// - connect to on port 1883 using WebSockets
  • tls:// - connect to on port 8883 using TLS (ssl:// and tcps:// are synonyms for tls://)

Here is a very simple example that subscribes to a topic and publishes 5 messages:

package main

import (
  //import the Paho Go MQTT library
  MQTT ""

//define a function for the default message handler
var f MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
  fmt.Printf("TOPIC: %s\n", msg.Topic())
  fmt.Printf("MSG: %s\n", msg.Payload())

func main() {
  //create a ClientOptions struct setting the broker address, clientid, turn
  //off trace output and set the default message handler
  opts := MQTT.NewClientOptions().AddBroker("tcp://")

  //create and start a client using the above ClientOptions
  c := MQTT.NewClient(opts)
  if token := c.Connect(); token.Wait() && token.Error() != nil {

  //subscribe to the topic /go-mqtt/sample and request messages to be delivered
  //at a maximum qos of zero, wait for the receipt to confirm the subscription
  if token := c.Subscribe("go-mqtt/sample", 0, nil); token.Wait() && token.Error() != nil {

  //Publish 5 messages to /go-mqtt/sample at qos 1 and wait for the receipt
  //from the server after sending each message
  for i := 0; i < 5; i++ {
    text := fmt.Sprintf("this is msg #%d!", i)
    token := c.Publish("go-mqtt/sample", 0, false, text)

  time.Sleep(3 * time.Second)

  //unsubscribe from /go-mqtt/sample
  if token := c.Unsubscribe("go-mqtt/sample"); token.Wait() && token.Error() != nil {


Back to the top