我想在go中将xml属性解析为iota枚举类型(int)。
在下面您可以看到我尝试的操作,但是由于无法获取枚举变量的地址,因此无法正常工作。
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类型一起工作吗?
更新:我知道我可以通过在Tag中添加UnmarshalXML
方法来解决此问题,但我想尽可能避免这种情况,因为我有很多具有不同属性的不同标签,但只有少数自定义类型属性。因此,不希望为每个标签实施UnmarshalXML
方法。
答案 0 :(得分:1)
我通过将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)
是否有一种“更优雅”的方式?或者我应该对自己现在拥有的东西感到满意?