必要なときにいつでも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"`
}
テスト両方のタイプ(Social
とSocial2
):
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}
これは素晴らしい提案です(y) –