初始化从XML创建的嵌套匿名结构到结构转换器

时间:2020-06-02 11:03:29

标签: go struct

以下是Go的XML到struct转换的输出

type Metadata struct {
XMLName     xml.Name `xml:"metadata"`
Text        string   `xml:",chardata"`
Ns2         string   `xml:"ns2,attr"`
PasMetadata struct {
    Text        string `xml:",chardata"`
    SimpleValue struct {
        Text  string `xml:",chardata"`
        Entry struct {
            Text  string `xml:",chardata"`
            Key   string `xml:"key"`
            Value string `xml:"value"`
        } `xml:"entry"`
    } `xml:"simple_value"`
} `xml:"pas_metadata"`}

但是基于对嵌套匿名结构的建议,创建了如下的其他结构

    type PasMetadata struct {
    Text        string `xml:",chardata"`
    SimpleValue `xml:"simple_value"`
}

type SimpleValue struct {
    Text  string `xml:",chardata"`
    Entry `xml:"entry"`
}

type Entry struct {
    Text  string `xml:",chardata"`
    Key   string `xml:"key"`
    Value string `xml:"value"`
}

type Metadata struct {
    XMLName     xml.Name `xml:"metadata"`
    Text        string   `xml:",chardata"`
    Ns2         string   `xml:"ns2,attr"`
    PasMetadata `xml:"pas_metadata"`
}

现在使用以下语句初始化时出现错误

metinfo := Metadata{Ns2: "http://test.com", PasMetadata{SimpleValue{Entry{Key: "testcode", Value: "testvalue"}}}}

错误是:字段:值和值初始值设定项的混合

1 个答案:

答案 0 :(得分:0)

embedded structs的初始化与常规的类似,请参见composite literals。如果指定字段名称,则必须全部指定。

对于嵌入式结构,字段名称是嵌入式类型的名称。

因此您的复合文字变为:

metinfo := Metadata{Ns2: "http://test.com", PasMetadata: PasMetadata{SimpleValue: SimpleValue{Entry: Entry{Key: "testcode", Value: "testvalue"}}}}

与您的区别在于,始终设置字段名称。具体来说:

  • PasMetadata: PasMetadata{...}
  • SimpleValue: SimpleValue{...}
  • Entry: Entry{...}