恐慌:SetUint使用使用未导出字段获得的值

sun*_*ong 3 arrays go

从字节缓冲区接收服务器,我想复制结构。

缓冲区的格式为固定大小的字节,如下所示。

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)

noa*_*amt 7

问题在于,所有HeaderT的字段都不是“公共”的。

请注意,所有字段均以小写字母开头-这意味着这些字段对于包外部的任何代码均不可访问。

规格

导出的标识符

标识符可以被导出以允许从另一个包访问它。如果同时满足以下条件,则导出标识符:

  • 标识符名称的第一个字符是Unicode大写字母(Unicode类“ Lu”);和
  • 标识符在包块中声明,或者是字段名或方法名。

所有其他标识符都不会导出。

尝试通过大写名称来导出它们:

type HeaderT struct {
    MagicValue [8]byte
    BodyLength [4]byte
    BodyVersion [1]byte
    ...
}
Run Code Online (Sandbox Code Playgroud)