2014-09-19 4 views
0

У меня есть структуры в ходе:Почему эти две структуры не равны?

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 и функцию декодирования для создания пакетов и для кодирования их в бинарный код. Однако почему эти два экземпляра.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} 

для Mee кажется равным. Но почему они выглядят как 0xc2080004f8 vs 0xc2080004b8, когда я не вижу разницы, когда я проверяю пакет.header напрямую?

+0

Укажите, как вы создаете экземпляры, передаете ли вы значение по ссылке? –

ответ

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) 
} 

playground

1

Каждый вызов Decode выделяет новое значение типа header. Вы просматриваете разные адреса для этих выделенных заголовков. Значения двух заголовков имеют одинаковое содержимое, но они имеют разные адреса.

+0

Я тоже так думал, но я думаю, что главная проблема в том, что он сравнивает 2 указателя пакета, а не заголовок, сравнивая с '* p1 == * p2' сбой из-за использования среза, заменяя срезы массивами исправить это, но он все равно будет терпеть неудачу из-за указателя заголовка. – OneOfOne