Как демонтировать атрибут enum xml в go? - PullRequest
0 голосов
/ 27 мая 2019

Я хочу проанализировать атрибут xml как тип перечисления iota (int) в go.

Ниже вы можете увидеть, что я пробовал, но это не работает, потому что адрес переменных перечисления не может быть взят.

type EnumType int
const (
    EnumUnknown EnumType = iota
    EnumFoo
    EnumBar
)

func (E *EnumType) UnmarshalXMLAttr(attr xml.Attr) error {
    switch attr.Value {
    case "foo":
        E = &EnumFoo
    case "bar":
        E = &EnumBar
    default:
        E = &EnumUnknown
    }
    return nil
}


// Example of how the unmarshal could be called:
type Tag struct {
    Attribute EnumType `xml:"attribute,attr"`
}

func main() {
    tag := &Tag{}
    xml.Unmarshal([]byte("<tag attribute=\"foo\"/>"), tag)
}

Любой другой способ заставить UnmarshalXMLAttr работать с типами int?

Обновление: я знаю, что могу решить эту проблему, добавив метод UnmarshalXML в Tag, но хочупо возможности избегайте этого, потому что у меня много разных тегов с множеством разных атрибутов, но только с несколькими типизированными атрибутами.Поэтому реализация UnmarshalXML методов для каждого тега не будет предпочтительной.

1 Ответ

1 голос
/ 27 мая 2019

Я решил проблему, заключив int в структуру.

type EnumType int
const (
    EnumUnknown EnumType = iota
    EnumFoo
    EnumBar
)
type EnumContainer struct {
    Value EnumType
}

func (E *EnumContainer) UnmarshalXMLAttr(attr xml.Attr) error {
    switch attr.Value {
    case "foo":
        E.Value = EnumFoo
    case "bar":
        E.Value = EnumBar
    default:
        E.Value = EnumUnknown
    }
    return nil
}


// Example of how the unmarshal could be called:
type Tag struct {
    Attribute EnumContainer `xml:"attribute,attr"`
}

func main() {
    tag := &Tag{}
    xml.Unmarshal([]byte("<tag attribute=\"foo\"/>"), tag)

Есть ли "более элегантный" способ или я должен быть доволен тем, что у меня сейчас есть?

...