1

我正在使用一个返回 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>myemail@example.com</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

有人可以帮我弄清楚发生了什么以及如何解决它吗?

4

1 回答 1

2

你可能误解了什么,omitempty意思。它仅在编组数据时生效。如果您使用 解组<billing/>到指针字段,omitempty,它仍将初始化该字段。然后,由于 XML 元素为空,因此Billing不会设置其自身的字段。在实践中,如果你假设这customer.Billing != nil意味着customer.Billing.Address != nil,你会得到观察到的恐慌。

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

于 2013-08-23T09:37:47.487 回答