复合类型和指针方法

时间:2012-11-16 10:18:59

标签: go

我在根据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方法)?

谢谢

1 个答案:

答案 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
}