具有不同类型或对象继承的数组

时间:2018-01-25 21:47:40

标签: arrays xml go

我在golang中编写了一个xml响应API。按照xml documentation中的示例,很容易创建xml,为它们提供属性等等。

问题是我需要使用相同名称和不同顺序的多个标签。

<block>
    <tag1>A Value1</tag1>
    <tag2>B Value1</tag2>
    <tag1>A Value2</tag1>
</block>

创建类似

的结构
type Tag1 struct {
    Value string `xml:",chardata"`
}
type Tag2 struct {
    Value string `xml:",chardata"`
}
type Block struct {
    XMLName   xml.Name `xml:"block"`
    Tags1     []Tag1   `xml:"tag1"`
    Tags2     []Tag2   `xml:"tag2"`
}

I achieved这个xml:

<block>
    <tag1>A Value1</tag1>
    <tag1>A Value2</tag1>
    <tag2>B Value1</tag2>
</block>

由于block定义中的数组类型而导致的。我想要的是一种将数组类型定义为继承两个Tag类型的接口的方法。喜欢这个

type Block struct {
    XMLName   xml.Name `xml:"block"`
    Tags      []Tags   `xml:"tags"`
}
type (Tags t) Tag1 struct{
    Value string `xml:",chardata"`
}
type (Tags t) Tag2 struct{
    Value string `xml:",chardata"`
}

这样我就可以按照

的附加顺序定义xml中的出现顺序
a1 := Tag1{"A Value1"}
b1 := Tag2{"B Value1"}
a2 := Tag1{"A Value2"}

arr :=  []Tags{}
arr = append(arr,a1)
arr = append(arr,b1)
arr = append(arr,a2)

v.Tags = arr

我已经做了一些阅读,并且我试图避免实现xml包中使用的编组功能。感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

我解决了不同的问题。我只是没有找到正确的方法。 This question描述了我需要的东西。通过在Tag1结构中定义[]interface{}值,我可以以编程方式定义标记的名称。然后只需在旧朋友type Tag1 struct { XMLName xml.Name Value string `xml:",chardata"` } type Block struct { XMLName xml.Name `xml:"block"` Tags []interface{} } a1 := Tag1{XMLName: xml.Name{Local: "tag1"}, Value: "A Value1"} a2 := Tag1{XMLName: xml.Name{Local: "tag1"}, Value: "A Value2"} b1 := Tag2{XMLName: xml.Name{Local: "tag2"}, Value: "B Value1"} v := &Block{} v.Tags = []interface{}{a1, b1, a2} 类型中包含不同的Tags值。

static Items()
{
    items = Enumerable.Repeat(new Item(), Count).AsParallel().ToList();
}

检查this example以便播放。