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

yjmyzz 阅读:53 2025-06-02 22:19:02 评论:0

以下是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"}}}} 

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

请您参考如下方法:

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{...}

  • 标签:XML
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号