我正在使用一个返回XML的REST API,并试图将XML解码,并且出现了omitempty无法正常工作的问题。这是一个有效的XML文件的示例:

<?xml version='1.0' encoding='UTF-8'?>
<customer uri="/api/customers/339/" id="339">
    <name>
        <first>Firstname</first>
        <last>Lastname</last>
    </name>
    <email>[email protected]</email>
    <billing>
        <address>
            <address1>123 Main St.</address123>
            <address2></address2>
            <city>Nowhere</city>
            <state>IA</state>
            <country>USA</country>
            <zip>12345</zip>
        </address>
    </billing>
</customer>

这是“不良”记录的示例
<?xml version='1.0' encoding='UTF-8'?>
<customer uri="/api/customers/6848/" id="6848">
    <name>
        <first>Firstname</first>
        <last>Lastname</last>
    </name>
    <email/>
    <billing/>
</customer>

现在,我的结构如下设置:
 type Customer struct {
     ID      int      `xml:"id,attr"`
     Name    *Name    `xml:"name,omitempty"`
     Billing *Billing `xml:"billing,omitempty"`
 }

 type Billing struct {
     Address *Address `xml:"address,omitempty"`
 }

 type Address struct {
     address_1 string `xml:",omitempty"`
     address_2 string `xml:",omitempty"`
     city      string `xml:",omitempty"`
     postal    string `xml:",omitempty"`
     country   string `xml:",omitempty"`
 }

 type Name struct {
     first, last string
 }

当XML遵循第一个示例<billing></billing>的模式时,通读所有记录将起作用,但是当它遇到具有<billing/>之类的记录时,它将引发以下错误:panic: runtime error: invalid memory address or nil pointer dereference
有人可以帮我弄清楚发生了什么事以及如何解决吗?

最佳答案

您可能会误解,omitempty的含义。仅在编码数据时有效。如果您使用<billing/>,omitempty解码到一个指针字段,它将仍然初始化该字段。然后,由于XML元素为空,因此不会设置Billing本身的字段。在实践中,如果您认为customer.Billing != nil意味着customer.Billing.Address != nil,您将得到观察到的 panic 。

注意:http://play.golang.org/p/dClkfOVLXh

关于go - 使用指针时,omitempty在编码/xml中不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18394911/

10-08 22:43