2017-02-27 2 views
5

Resultは別に定義Addressへの参照が含まれていることを、これらの構造体をは直接移動<a href="https://golang.org/pkg/encoding/xml/#Unmarshal" rel="nofollow noreferrer">documentation for xml:Unmarshal</a>で間接的にネストされた構造体

type Address struct { 
     City, State string 
    } 
    type Result struct { 
     XMLName xml.Name `xml:"Person"` 
     Name string `xml:"FullName"` 
     Phone string 
     Email []Email 
     Groups []string `xml:"Group>Value"` 
     Address 
    } 

注意を使用して、このXML

<Person> 
     <FullName>Grace R. Emlin</FullName> 
     <Company>Example Inc.</Company> 
     <Email where="home"> 
      <Addr>[email protected]</Addr> 
     </Email> 
     <Email where='work'> 
      <Addr>[email protected]</Addr> 
     </Email> 
     <Group> 
      <Value>Friends</Value> 
      <Value>Squash</Value> 
     </Group> 
     <City>Hanga Roa</City> 
     <State>Easter Island</State> 
    </Person> 

をアンマーシャルの例があります。明らかに、このコードは動作します。私はこれらの構造体

type D struct { 
    E string 
    F int 
} 
type C struct { // Compiles OK but result empty. 
    D 
} 

を使用して、このXML

<C> 
    <D> 
    <E>Fred</E> 
    <F>42</F> 
    </D> 
</C> 

を非整列化しようとすると


は、私は空の結果{{ 0}}を取得します。ただし、以下の構造体を参照してくださいPlayground example{{Fred 42}}

type C struct { // This works. 
    D struct { 
    E string 
    F int 
    } 
} 

を生産OK動作します。

構造体に関する微妙な点がありませんか?

答えて

5

あなたはこれを行うとき:これはembedding呼ばれる

type C struct { 
    D 
} 

Dがフィールドを組み込み匿名フィールドまたはです)。埋め込みタイプのフィールド(およびメソッド)が埋め込みタイプの一部になっているかのように考えることができます(にプロモートされます)。この場合、C.EC.Fと書くのは「合法」です。

あなたがない:

type C struct { 
    D struct { 
     E string 
     F int 
    } 
} 

これはが埋め込まれていない(または "ネスト")。ここでDはタイプのフィールドと呼ばれるの「通常の」フィールドです。 Dはフィールドの名前で、フィールドのタイプである匿名のtype literalが続きます。ここでは、C.EでもC.Fでも、C.D.EC.D.Fと書くことは合法ではありません。これは、アンマーシャリングしようとするXML構造の適切なマッピングです。したがって、これは動作します(Go Playgroundで試してください)。あなたは、通常のフィールドへの埋め込みを変更した場合、それはまた、動作することを

注(Go Playground上でそれを試してみてください):

type C struct { 
    D D 
} 

はまた、あなたが指定した場合は、全体Dラッパー構造体を省略することができますことに注意してくださいフィールド内のXML要素パス:

type C struct { 
    E string `xml:"D>E"` 
    F int `xml:"D>F"` 
} 

Go Playgroundでお試しください。

関連する問題

 関連する問題