gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:34:24 26 4
gpt4 key购买 nike

我在 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
}

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

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

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

&{dataLength:1 optDataLength:0 packetType:5}
&{dataLength:1 optDataLength:0 packetType:5}

这对我来说似乎是平等的。但是,当我直接检查 packet.header 时,为什么它们看起来像 0xc2080004f8 和 0xc2080004b8 而我看不出区别?

最佳答案

它们不相等,因为它比较的是指针而不是指针的值。您的选择不多。

  1. 不要使用指针,您将无法在任何一个结构中使用 slice ,您可以使用固定大小的数组。
  2. 编写自己的 func (p *packet) Equals(o *packet) bool 并自己进行比较。
  3. 使用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)
}

playground

关于go - 为什么这两个结构不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25941791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com