我在基于类型time.Time创建自己的类型Date时遇到一些问题
我试图创建Date类型,如下所示:
type Date time.Time
func (d Date) UnmarshalJSON(buf []byte) error {
var s string
json.Unmarshal(buf, &s)
t, err := time.Parse(timeLayout,s)
d= Date(t)
return err
}
func (d Date) MarshalJSON() ([]byte, error) {
b,_ := json.Marshal(d.Format(timeLayout))
return b,nil
}
这本身有效,我可以将此Date作为time.Time存储在AppEngine数据存储区中。封送处理本身也可以,但是不起作用是:然后从json解组时,Date d会填充该值。据我所知,这是正确的,因为unmarshalJson函数创建了Date的副本。
因此,当我将unmarshalJson函数更改为使用指向日期的指针时,便无法使用:
d=Date(t)
所以第一个问题,是否有解决方案?
我现在要做的是重写代码,如下所示:
type Date struct {
t time.Time
}
func (d *Date) UnmarshalJSON(buf []byte) error {
var s string
json.Unmarshal(buf, &s)
t, err := time.Parse(timeLayout,s)
d.t = t
return err
}
func (d Date) MarshalJSON() ([]byte, error) {
b,_ := json.Marshal(d.t.Format(timeLayout))
return b,nil
}
这是可行的,但在这种情况下,Date不是时间的扩展类型.Time仅是time.Time类型的包装。
有更好的解决方案吗?我仍然很新。
我需要此Date类型,以具有仅Date json格式的类型,因为Chrome仅支持html5类型:date而不是datetime。和方法覆盖不可能(去覆盖类型time.Time的un / marshalJson方法)?
相关分类