2014-09-19 2 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 
} 

. 그렇다면이 두 인스턴스와 헤더가 다른 이유는 무엇입니까? 내가 두 헤더의에에 println를 실행하면

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

내가 얻을 : MEE에 동일한 것

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

합니다. 하지만 내가 packet.header를 직접 확인할 때 차이점을 볼 수 없을 때 0xc2080004f8 대 0xc2080004b8과 같이 보이는 이유는 무엇입니까?

+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

관련 문제