Go 复合类型和指针方法

Go 复合类型和指针方法,go,Go,我在基于类型time.time创建自己的类型日期时遇到一些问题 我尝试创建日期类型,如下所示: 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

我在基于类型time.time创建自己的类型日期时遇到一些问题

我尝试创建日期类型,如下所示:

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
}
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
}
这本身是有效的,我可以将这个日期存储为时间。时间在AppEngine数据存储中。 编组本身也起作用, 但不起作用的是:当从json中解组时,日期d将填充值。 据我所知,这是因为unmarshalJson函数创建日期的副本

因此,当我将unmarshalJson函数更改为使用指向日期的指针时 那么我不能用:

d=Date(t)
所以第一个问题,有没有解决办法

我现在所做的是将代码重写如下:

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
}
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类型的包装器

有更好的解决办法吗?我还是新手

我需要这个日期类型,只有日期的json格式的类型,因为Chrome只支持html5类型:Date而不是datetime。 方法重写在go中不可能(意味着重写time.time类型的un/marshalJson方法)

谢谢

完全未经测试的代码:

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
}

我测试过了,它能工作:)谢谢。所以这一行:
*d=*(*Date)(&t)
意味着指针d被设置为:指针of:address of t转换为指针type Date,不是吗?当然,带包装器的解决方案(我的问题中的一个)效率较低,因为我处理两种类型。如果具有转换的解决方案在一个类型上工作,并且其本身也始终在同一个对象上工作,那么由于不需要复制或创建类型,因此内存消耗更少,性能更好?
*d=*(*Date)(&t)
以类型安全的方式将值
d
指向
t