golang 解析 byte slice 类型的 MQTT 消息 payload

文章目录

    MQTT Message payload 的类型

    可以看到 payload 函数返回 byte slice 类型。

    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())
    }
    
    type Message interface {
    	Duplicate() bool
    	Qos() byte
    	Retained() bool
    	Topic() string
    	MessageID() uint16
    	Payload() []byte
    	Ack()
    }
    
    func (m *message) Payload() []byte {
    	return m.payload
    }
    

    打印调试日志

    参考

    https://pkg.go.dev/fmt

    String and slice of bytes (treated equivalently with these verbs):
    
    %s	the uninterpreted bytes of the string or slice
    %q	a double-quoted string safely escaped with Go syntax
    %x	base 16, lower-case, two characters per byte
    %X	base 16, upper-case, two characters per byte
    

    如果是字符串类型的数据,例如 json 格式的 payload,可以直接当成字符串类型打印日志:

    fmt.Printf("MSG: %s\n", msg.Payload())
    

    如果是 byte 类型,可以这样打印调试日志:

    fmt.Printf("MSG: %X\n", msg.Payload())
    

    byte

    首先,要了解 golang 里面的一些名词:

    • byte: 8 位无符号数,即 uint8,范围 0~255,可以表示 ASCII 字符
    • rune: 符文,int32 类型,可以表示多字节符号,例如 utf-8
      var a byte = 97 // uint8 var b = 98 // int c := 'c' // int32

    byte array

    data := []byte{102, 97, 108, 99, 111, 110}
    

    使用十六进制初始化 byte 和 byte array

    x := byte(0x13)
    xs := []byte{0xAC, 0xCA}
    

    byte array 比对

    xs := []byte{0xAC, 0xCA}
    xs2 := []byte{0xAC, 0xCA, 0x01, 0x02}
    
    if bytes.Equal(xs2[0:2], xs) {
    	log.Println("equal")
    } else {
    	log.Println("not equal")
    }
    

    byte array 作为函数参数时,是否有必要使用指针

    https://medium.com/swlh/golang-tips-why-pointers-to-slices-are-useful-and-how-ignoring-them-can-lead-to-tricky-bugs-cac90f72e77b

    还是使用指针靠谱。

    参考

    • https://zetcode.com/golang/byte/ 广告太多,需要一定的心理承受能力
    • https://stackoverflow.com/questions/56605810/how-to-define-bit-literals-in-go
    • https://medium.com/swlh/golang-tips-why-pointers-to-slices-are-useful-and-how-ignoring-them-can-lead-to-tricky-bugs-cac90f72e77b

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式