2017-09-18 9 views
0
type Social struct { 
    XMLName xml.Name `xml:"social"` 
    Facebook string `xml:"facebook"` 
    Twitter string `xml:"twitter"` 
    Youtube string `xml:"youtube"` 
} 

上記の例では、私はxml:"facebook"を複数の構造体に再利用しています。私はそれを定数に抽出してすべての構造体で参照できるかどうかを知りたいと思います。GoLang:構造体のxmlタグ定義をリファクタリングする

または、仕様/ドキュメントを読み込んで構造体を定義する必要があり、これを達成するための具体的な方法が見つかりませんでした。

それは可能ですか?

PS:私が意図したことは、新しい構造体を作成したときに間違って入力することが容易であることです(何回か私に起こったように)。

答えて

2

必要なときにいつでも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} 
+0

これは素晴らしい提案です(y) –

1

可能でしょうか?

いいえ。これはできません。

+0

確かにそうではありませんでした。 –

関連する問題