2017-02-27 3 views
5

Im Go documentation for xml:Unmarshal gibt es ein Beispiel, das diese XML-Direkt vs indirekt verschachtelt structs

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

mit diesen structs

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 
    } 

Beachten Sie, dass Result enthält einen Verweis auf die separat definiert Address entpackt. Offensichtlich funktioniert dieser Code.


Wenn ich versuche, diese xml

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

mit diesen structs

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

ich leer Ergebnisse {{ 0}} erhalten zu entpacken. Jedoch unterhalb der Struktur OK arbeitet Herstellung {{Fred 42}}

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

Siehe Playground example.

Fehle mir ein subtiler Punkt über Strukturen?

Antwort

5

Wenn Sie dies tun:

type C struct { 
    D 
} 

Diese embedding genannt wird (D ist ein anonyme Feld oder eingebettet Feld). Sie können sich das so vorstellen, als ob die Felder (und Methoden) des eingebetteten Typs Teil des Einbettungstyps werden (sie erhalten befördert). In diesem Fall ist es "legal", C.E und C.F zu schreiben.

Wenn Sie das tun:

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

Dies ist nicht Einbettung (oder "Nesting"). Hier ist ein "normales", benanntes Feld des C Typs. ist der Name des Feldes, gefolgt von einem anonymen type literal, der Art des Feldes. Hier ist es nicht erlaubt, C.E noch C.F, nur C.D.E und C.D.F zu schreiben. Und das ist die richtige Zuordnung der XML-Struktur, die Sie versuchen zu entpacken, daher funktioniert das (versuchen Sie es auf der Go Playground).

Beachten Sie, dass, wenn Sie die Einbettung in eine reguläre Feld ändern, wird es auch funktionieren (versuchen Sie es auf dem Go Playground):

type C struct { 
    D D 
} 

Beachten Sie auch, dass Sie die ganze D Wrapper struct überspringen können, wenn Sie die angeben XML-Element Pfade in dem Feld tags:

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

Versuchen sie es auf den Go Playground.

Verwandte Themen