4

私は XML を解析していますが、ドキュメントのほとんどすべてのレベルでdescription.

おもちゃの例を次に示します。

<obj>
    <description>outer object</description>
    <subobjA>
        <description>first kind of subobject</description>
        <foo>some goop</foo>
    </subobjA>
    <subobjB>
        <description>second kind of subobject</description>
        <bar>some other goop</bar>
    </subobjB>
</obj>

これは、関係するすべての構造体がDescription、同一のタグを持つ同一のメンバーを持つことを意味し`xml:"description,omitempty"`ます。

機能するコードは次のとおりです: http://play.golang.org/p/1-co6Qcm8d

Description タグは DRY の方がいいと思います。やりたいことは明らかです:

type Description string `xml:"description,omitempty"`

その後、全体でタイプを使用Descriptionします。ただし、構造体メンバーのみがタグを持つことができます。私が書きたいことについては、 http://play.golang.org/p/p83UrhrN4uを参照してください。コンパイルされません。

構造体を作成しDescriptionて繰り返し埋め込むこともできますが、アクセス時に間接的なレイヤーが追加されます。

これについて別の方法はありますか?

4

1 に答える 1

4

Description(すでに提案したように)リファクタリングされた構造体を埋め込むことが方法です:

(遊び場)

type describable struct{
    Description string `xml:"description"`
}

type subobjA struct {
    describable
    XMLName     xml.Name `xml:"subobjA"`
}

type subobjB struct {
    describable
    XMLName     xml.Name `xml:"subobjB"`
}

type obj struct {
    XMLName     xml.Name `xml:"obj"`
    A           subobjA
    B           subobjB
}

前述の間接層は存在しません。そのトピックに関する仕様を引用するには:

構造体 x の無名フィールドのフィールドまたはメソッド f は、xf がそのフィールドまたはメソッド f を示す有効なセレクターである場合、promoted と呼ばれます。

プロモートされたフィールドは、構造体の複合リテラルでフィールド名として使用できないことを除いて、構造体の通常のフィールドのように機能します。

だからあなたはこれを行うことができます:

err := xml.Unmarshal([]byte(sampleXml), &sampleObj)
fmt.Println(sampleObj.Description)
fmt.Println(sampleObj.A.Description)

sampleObj.describable.Descriptionに昇格されるsampleObj.Descriptionため、ここでは間接的なレイヤーはありません。

于 2013-05-07T00:30:08.963 に答える