我正在解析XML,而且至多文档的每个级别都有一个description
。
这是一个玩具示例:
<obj>
<description>outer object</description>
<subobjA>
<description>first kind of subobject</description>
<foo>some goop</foo>
</subobjA>
<subobjB>
<description>second kind of subobject</description>
<bar>some other goop</bar>
</subobjB>
</obj>
这意味着所涉及的每个结构都具有相同的Description
成员,具有相同的标记`xml:"description,omitempty"`
。
这是有效的代码:http://play.golang.org/p/1-co6Qcm8d
我宁愿描述标签是干的。要做的显而易见的事情是:
type Description string `xml:"description,omitempty"`
然后始终使用类型Description
。但是,只有struct成员才能拥有标记。请参阅http://play.golang.org/p/p83UrhrN4u了解我想写的内容;它没有编译。
可以创建一个Description
结构并重复嵌入,但在访问时会增加一层间接。
还有其他方法可以解决这个问题吗?
答案 0 :(得分:4)
嵌入一个重新考虑的Description
结构(如您所建议的那样)是要走的路:
type describable struct{
Description string `xml:"description"`
}
type subobjA struct {
describable
XMLName xml.Name `xml:"subobjA"`
}
type subobjB struct {
describable
XMLName xml.Name `xml:"subobjB"`
}
type obj struct {
XMLName xml.Name `xml:"obj"`
A subobjA
B subobjB
}
所提到的间接层不存在。引用the spec关于该主题:
如果x.f是表示该字段或方法f的合法选择器,则调用struct x中匿名字段的字段或方法f。
提升字段的作用类似于结构的普通字段,除了它们不能用作结构的复合文字中的字段名称。
所以你可以这样做:
err := xml.Unmarshal([]byte(sampleXml), &sampleObj)
fmt.Println(sampleObj.Description)
fmt.Println(sampleObj.A.Description)
sampleObj.describable.Description
被提升为sampleObj.Description
,因此此处没有进一步的间接层。