2016-04-13 2 views
3

Я пытаюсь отформатировать собственный тип времени Date, который реализует интерфейс Marshaler и просто форматирует себя как «2006-01-02» при написании как XML ,Golang - Marshaling XML time.Time как формат даты для атрибута XML

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 {Тип: (* reflect.rtype)} - выбрасывается.

Я что-то упускаю, любые идеи?

ответ

5

Вы внедряете неправильный интерфейс.

Поскольку тип Дата предназначен для выстраивали в качестве атрибута (как показано от 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 
} 

Обратите внимание, что я удалил явно ненужные цитаты из строки значений.

Смежные вопросы