gpt4 book ai didi

xml - 高语 : Refactoring xml tag definition in struct

转载 作者:IT王子 更新时间:2023-10-29 02:32:15 31 4
gpt4 key购买 nike

type Social struct {
XMLName xml.Name `xml:"social"`
Facebook string `xml:"facebook"`
Twitter string `xml:"twitter"`
Youtube string `xml:"youtube"`
}

在上面的示例中,我在多个结构中重用了 xml:"facebook"。我想知道我是否可以将它提取为常量并在所有结构中引用它。

或者是您必须如何定义我通读了规范/文档但没有找到实现此目的的具体方法。

这可能吗?

PS:我的目的是减少重复代码,因为在创建新结构时很容易输入错误(这种情况在我身上发生过几次)。

最佳答案

重复一个tag并不头疼每当你需要它。请注意,规范不允许您在为结构字段定义标签时使用常量或变量。 struct 标签只能是 string literal .引自 Spec: Struct types:

StructType    = "struct" "{" { FieldDecl ";" } "}" .
FieldDecl = (IdentifierList Type | EmbeddedField) [ Tag ] .
EmbeddedField = [ "*" ] TypeName .
Tag = string_lit .

“外包”标签定义的一种方法是将整个结构字段“外包”到另一个结构中,并让 Social 嵌入该结构。

例如:

type Social struct {
XMLName xml.Name `xml:"social"`
HasFacebook
Twitter string `xml:"twitter"`
Youtube string `xml:"youtube"`
}

type HasFacebook struct {
Facebook string `xml:"facebook"`
}

现在您可以在其他类型/结构中重用它:

type Social2 struct {
HasFacebook
Linkedin string `xml:"linkedin"`
}

测试两种类型(SocialSocial2):

func main() {
var s *Social
if err := xml.Unmarshal([]byte(src), &s); err != nil {
panic(err)
}
fmt.Printf("%+v\n", s)

var s2 *Social2
if err := xml.Unmarshal([]byte(src), &s2); err != nil {
panic(err)
}
fmt.Printf("%+v\n", s2)
}

const src = `<social>
<facebook>someface</facebook>
<twitter>sometwitter</twitter>
<linkedin>somelinkedin</linkedin>
</social>`

输出(在 Go Playground 上尝试):

&{XMLName:{Space: Local:social} HasFacebook:{Facebook:someface} Twitter:sometwitter Youtube:}
&{HasFacebook:{Facebook:someface} Linkedin:somelinkedin}

关于xml - 高语 : Refactoring xml tag definition in struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46275266/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com