猿问

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

我有一个结构体:


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?


PIPIONE
浏览 258回答 1
1回答

慕尼黑5688855

它们不相等,因为它比较的是指针而不是指针的值。你有几个选择。不要使用指针,您将无法在任一结构中使用切片,您可以使用固定大小的数组。自己写,自己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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答