我正在尝试设置自定义时间类型 Date 的格式,它实现了 Marshaler 接口(interface),并且在编写为 XML 时仅将自身格式化为“2006-01-02”。
type Person struct {
...
DateOfBirth Date `xml:"DOB,attr"`
...
}
type Date time.Time
func (d Date) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
dateString := fmt.Sprintf("\"%v\"", time.Time(d).Format("2006-01-02"))
e.EncodeElement(dateString, start)
return nil
}
我正在使用 this SO作为引用,但会抛出错误 - &xml.UnsupportedTypeError{Type:(*reflect.rtype)}。
我遗漏了什么,有什么想法吗?
最佳答案
您正在实现错误的接口(interface)。
由于 Date 类型要作为属性进行编码(如 xml:"DOB,attr"
标记所示),它需要实现 xml.MarshalerAttr接口(interface):
type MarshalerAttr interface {
MarshalXMLAttr(name Name) (Attr, error)
}
所以你可能需要添加这样的代码:
func (d Date) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
dateString := time.Time(d).Format("2006-01-02")
attr := xml.Attr {
name,
dateString,
}
return attr, nil
}
请注意,我从值字符串中删除了明显不必要的引号。
关于xml - Golang - 将 XML time.Time 编码为 XML 属性的日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36607875/