我在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?
答案 0 :(得分:2)
它们并不相同,因为它比较指针而不是指针的值。 你没什么选择。
func (p *packet) Equals(o *packet) bool
并自行比较。reflect.DeepEqual
,这是迄今为止最慢/效率最低的解决方案,我个人认为是#2。简单实施#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)
}
答案 1 :(得分:1)
每次调用Decode
都会分配一个类型为header
的新值。您正在观察这些已分配标头的不同地址。两个标头值具有相同的内容,但它们位于不同的地址。