gpt4 book ai didi

xml - 如何在 Go 中将自定义格式化时间序列化到 xml 或从 xml 序列化?

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:57 26 4
gpt4 key购买 nike

在将日期时间序列化为 xml 或从 xml 序列化时,如何使其使用自定义时间格式?

最佳答案

就像您实现 json.Marshalerjson.Unmarshaler 以使用 JSON 执行此操作一样(在 StackOverflow 和互联网上有很多关于此的帖子);一种方法是实现实现 encoding.TextMarshaler 的自定义时间类型和 encoding.TextUnmarshaler .

编码项目时,encoding/xml 使用这些接口(interface)(首先检查更具体的 xml.Marshalerxml.Unmarshaler接口(interface),但是后来的接口(interface)必须自己进行完整的 XML 编码)。

例如类似 ( full example on the Go Playground ):

const fixedFormat = "Mon Jan 02 2006"

type myTime1 struct {
time.Time
}

func (m myTime1) MarshalText() ([]byte, error) {
text := m.Time.Format(fixedFormat)
return []byte(text), nil
}
func (m *myTime1) UnmarshalText(text []byte) error {
t, err := time.Parse(fixedFormat, string(text))
if err == nil {
m.Time = t
}
return err
}

type myTime2 time.Time

func (m myTime2) MarshalText() ([]byte, error) {
text := time.Time(m2).Format(fixedFormat)
return []byte(text), nil
}
func (m *myTime2) UnmarshalText(text []byte) error {
t, err := time.Parse(fixedFormat, string(text))
if err == nil {
*m = myTime2(t)
}
return err
}

它们中的任何一个都可以用来代替 time.Time 作为与 xml(未)编码一起使用的更大数据结构的一部分。例如:

type Foo struct {
Date1 myTime1 `xml:"date1"`
Date2 myTime2 `xml:"date2"`
}

这些自定义时间类型的定义方式不同会改变您将它们与常规 time.Time 值一起使用的方式。例如

m1 := myTime1{time.Now()}
fmt.Println(m1)
if m1.Before(time.Now()) {}
t1 := m1.Time
// compared to:
m2 := myTime2(time.Now())
fmt.Println(time.Time(m2))
if time.Time(m2).Before(time.Now()) {}
t2 := time.Time(m2)

关于xml - 如何在 Go 中将自定义格式化时间序列化到 xml 或从 xml 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30928306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com