代码之家  ›  专栏  ›  技术社区  ›  sungyong

panic:SetUint使用未报告字段获得的值

  •  -1
  • sungyong  · 技术社区  · 7 年前

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

    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  |................|
    

    我的结构在下面。

    type HeaderT struct {
        magicValue [8]byte
        bodyLength [4]byte
        bodyVersion [1]byte
        ...
    }
    

    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
        ...
    }
    

    我的代码如下所示。

    未报告字段

    goroutine 38[正在运行]:reflect.flag.mustBeAssignable(0x1a8) 0xc0001a2000,0x1a8) /usr/local/go/src/encoding/binary/binary.go:548+0x7c6编码/二进制。(*解码器)。值(0xc000148d88,0x125cfc0, 0xc0001a2000,0x1b1) /usr/local/go/src/encoding/binary/binary.go:510+0x104编码/二进制。(*解码器)。值(0xc000148d88,0x129fa00, 0xc0001a2000,0x199) /usr/local/go/src/encoding/binary/binary.go:248+0x342 main.onMessageReceived(0x13012a0、0xc000140000、0x1300c00、, 0xc000192000)

    1 回复  |  直到 7 年前
        1
  •  10
  •   noamt CoderYL    7 年前

    问题是,没有一个 HeaderT 的字段为“公共”。

    请注意,所有字段都以小写字母开头,这意味着包外的任何代码都无法访问这些字段。

    从 spec :

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

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

    请尝试将其名称大写以导出:

    type HeaderT struct {
        MagicValue [8]byte
        BodyLength [4]byte
        BodyVersion [1]byte
        ...
    }