我正在尝试格式化实现Marshaler接口的自定义时间类型Date,并在编写为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)} - 会被抛出。
我错过了什么,有什么想法吗?
答案 0 :(得分:5)
您正在实施错误的界面。
由于Date类型是作为属性编组的(如xml:"DOB,attr"
标记所示),因此需要实现xml.MarshalerAttr接口:
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
}
请注意,我从值字符串中删除了显然不必要的引号。