为什么这两个结构不相等?

时间:2014-09-19 20:17:37

标签: go

我在go中有一个结构:

type header struct {
    dataLength    uint16
    optDataLength uint8
    packetType    uint8
}
type packet struct {
        syncByte  uint8
        header    *header
        headerCrc uint8
        data      []byte
        optData   []byte
        dataCrc   uint8
}

如果我已经创建了一个Encode和Decode函数来创建包并将它们编码为二进制文件。但是为什么这两个instances.header不同?

&{syncByte:85 header:0xc2080004b8 headerCrc:112 data:[2] optData:[] dataCrc:14}
&{syncByte:85 header:0xc2080004f8 headerCrc:112 data:[2] optData:[] dataCrc:14}

如果我在这两个标题上运行Println,我会得到:

&{dataLength:1 optDataLength:0 packetType:5}
&{dataLength:1 optDataLength:0 packetType:5}
对我而言似乎是平等的。但是当我直接检查packet.header时,为什么我看不出差异,为什么它们看起来像0xc2080004f8 vs 0xc2080004b8?

2 个答案:

答案 0 :(得分:2)

它们并不相同,因为它比较指针而不是指针的值。 你没什么选择。

  1. 不要使用指针,你不能在任何结构中使用切片,你可以使用固定大小的数组。
  2. 自己编写func (p *packet) Equals(o *packet) bool并自行比较。
  3. 使用reflect.DeepEqual,这是迄今为止最慢/效率最低的解决方案,我个人认为是#2。
  4. 简单实施#2:

    func (h *header) Equal(o *header) bool {
        return h != nil && o != nil &&
            h.dataLength == o.dataLength &&
            h.optDataLength == o.optDataLength &&
            h.packetType == o.packetType
    }
    
    func (p *packet) Equal(o *packet) bool {
        return p != nil && o != nil &&
            p.header.Equal(o.header) &&
            p.syncByte == o.syncByte &&
            p.headerCrc == o.headerCrc &&
            p.dataCrc == o.dataCrc &&
            bytes.Equal(p.data, o.data) &&
            bytes.Equal(p.optData, o.optData)
    }
    

    playground

答案 1 :(得分:1)

每次调用Decode都会分配一个类型为header的新值。您正在观察这些已分配标头的不同地址。两个标头值具有相同的内容,但它们位于不同的地址。