I would like to do something like:
    <members>
        <!-- It's a first group -->
        <member>Whatever</member>
        ...
        <member>whatever</member>
        <!-- It's a second group -->
        <member>Whatever</member>
        ...
        <member>whatever</member>
    </members>
Is there any way to do this with golang?
You can do it in two ways. Firstly, you can make comment a part of a larger struct that embeds members and make it marshal a comment every time a member is marshalled:
type Members struct {
    XMLName xml.Name `xml:"members"`
    Members []CommentedMember
}
type CommentedMember struct {
    Member
    comment xml.Comment
}
func (cm CommentedMember) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    if cm.comment != nil {
        err := e.EncodeToken(cm.comment)
        if err != nil {
            return err
        }
    }
    return e.Encode(cm.Member)
}
type Member struct {
    XMLName xml.Name `xml:"member"`
}
The second way is to create a separate Comment type and make your Members struct contain different types:
type Members2 struct {
    XMLName xml.Name `xml:"members"`
    Members []interface{}
}
type Comment string
func (cm Comment) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    if cm != "" {
        return e.EncodeToken(xml.Comment(cm))
    }
    return nil
}
type Member struct {
    XMLName xml.Name `xml:"member"`
}
Here are both on the playground: https://play.golang.org/p/3n-xH1Zc-n.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With