我在根据time.Time
类型创建自己的类型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
}
这本身有效,我可以将这个日期存储为AppEngine数据存储区中的time.Time。 编组本身也有效, 但是不工作的是:然后当从json解组时,日期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.Time类型的包装。
还有更好的解决方案吗?我还是新手。
我需要这个Date类型,只有日期格式的json格式,因为Chrome只支持html5类型:date而不是datetime。 go中无法实现方法覆盖(意味着覆盖time.Time类型的un / marshalJson方法)?
谢谢
答案 0 :(得分:2)
完全未经测试的代码:
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
}