猿问

复合类型和指针方法

我在基于类型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方法)?


森栏
浏览 186回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答