为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
PIPIONE 2021-08-16 19:20:23
我有一个结构体:type header struct {    dataLength    uint16    optDataLength uint8    packetType    uint8}type packet struct {        syncByte  uint8        header    *header        headerCrc uint8        data      []byte        optData   []byte        dataCrc   uint8}如果我创建了一个用于创建包并将它们编码为二进制的编码和解码函数。但是为什么这两个instance.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 与 0xc2080004b8?
查看完整描述

1 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

它们不相等,因为它比较的是指针而不是指针的值。你有几个选择。

  1. 不要使用指针,您将无法在任一结构中使用切片,您可以使用固定大小的数组。

  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)

}


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信