从字节缓冲区接收服务器,我想复制结构。
缓冲区的格式为固定大小的字节,如下所示。
00000000 83 27 48 12 6c 00 00 00 01 02 00 00 01 01 00 02 |.'H.l...........|
00000010 10 01 d2 02 96 49 00 00 00 00 87 d6 12 00 00 00 |.....I..........|
00000020 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 02 01 02 3c 01 01 00 00 00 01 01 01 01 18 10 |....<...........|
00000040 2c 01 90 01 01 6c 07 03 c8 02 01 02 03 9c 0a 0b |,....l..........|
00000050 0c 00 00 00 01 01 00 00 00 00 00 00 00 01 01 01 |................|
00000060 01 01 01 01 01 01 01 01 01 00 01 01 01 00 00 00 |................|
Run Code Online (Sandbox Code Playgroud)
我的结构在下面。
type HeaderT struct {
magicValue [8]byte
bodyLength [4]byte
bodyVersion [1]byte
...
}
Run Code Online (Sandbox Code Playgroud)
我的实现在下面。
func onMessageReceived(client MQTT.Client, message MQTT.Message) {
payload := message.Payload()
fmt.Printf("Received message on topic: %s\nMessage: \n%s\n", message.Topic(), hex.Dump(payload))
header := HeaderT {}
err := binary.Read(bytes.NewBuffer(payload[:]), binary.LittleEndian, &header) // <-- error occurred at this line
...
}
Run Code Online (Sandbox Code Playgroud)
我的代码如下所示。
恐慌:reflect:reflect.Value.SetUint,使用通过未导出字段获得的值
goroutine 38 [running]: reflect.flag.mustBeAssignable(0x1a8) /usr/local/go/src/reflect/value.go:231 +0x1ee reflect.Value.SetUint(0x12540e0, 0xc0001a2000, 0x1a8, 0x83) /usr/local/go/src/reflect/value.go:1551 +0x2f encoding/binary.(*decoder).value(0xc000148d88, 0x12540e0, 0xc0001a2000, 0x1a8) /usr/local/go/src/encoding/binary/binary.go:548 +0x7c6 encoding/binary.(*decoder).value(0xc000148d88, 0x125cfc0, 0xc0001a2000, 0x1b1) /usr/local/go/src/encoding/binary/binary.go:510 +0x104 encoding/binary.(*decoder).value(0xc000148d88, 0x129fa00, 0xc0001a2000, 0x199) /usr/local/go/src/encoding/binary/binary.go:523 +0x2c5 encoding/binary.Read(0x12fcf80, 0xc00018a150, 0x1300c60, 0x14d76d0, 0x1248040, 0xc0001a2000, 0x0, 0x0) /usr/local/go/src/encoding/binary/binary.go:248 +0x342 main.onMessageReceived(0x13012a0, 0xc000140000, 0x1300c00, 0xc000192000)
问题在于,所有HeaderT的字段都不是“公共”的。
请注意,所有字段均以小写字母开头-这意味着这些字段对于包外部的任何代码均不可访问。
从规格:
导出的标识符
标识符可以被导出以允许从另一个包访问它。如果同时满足以下条件,则导出标识符:
- 标识符名称的第一个字符是Unicode大写字母(Unicode类“ Lu”);和
- 标识符在包块中声明,或者是字段名或方法名。
所有其他标识符都不会导出。
尝试通过大写名称来导出它们:
type HeaderT struct {
MagicValue [8]byte
BodyLength [4]byte
BodyVersion [1]byte
...
}
Run Code Online (Sandbox Code Playgroud)