필요할 때마다 tag을 반복하는 것이 두통이 아닙니다. struct 필드에 대한 태그를 정의 할 때이 스펙에서는 상수 나 변수를 사용할 수 없습니다. 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) –