首页 > 解决方案 > 初始化从 XML 创建的嵌套匿名结构到结构转换器

问题描述

以下是从 XML 到 Go 的结构转换的输出

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"}}}}

错误是:field:value 和 value 初始值设定项的混合

标签: gostruct

解决方案


嵌入式结构的初始化类似于常规结构,请参阅复合文字。如果指定字段名称,则必须指定所有字段。

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

所以你的复合文字变成:

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

与您的不同之处在于始终设置字段名称。具体来说:

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

推荐阅读