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 聊聊, 查看更多联系方式