【问题标题】:composite type and Pointer Methods复合类型和指针方法
【发布时间】:2012-11-16 18:38:07
【问题描述】:

我在根据类型 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
}

这本身有效,我可以将此日期作为 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.Time 类型的包装器。

有更好的解决方案吗?我还是新手。

我需要这个 Date 类型,有一个 Date only json 格式的类型,因为 Chrome 只支持 html5 类型:date 而不是 datetime。 并且方法覆盖在 go 中是不可能的(意味着覆盖 time.Time 类型的 un/marshalJson 方法)?

谢谢

【问题讨论】:

    标签: go


    【解决方案1】:

    完全未经测试的代码:

    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 设置为:指针:t 的地址转换为指针类型日期不是吗?
    • 可以肯定的是,带有包装器的解决方案(我的问题之一)效率较低,因为我处理两种类型。哪里有转换的解决方案适用于一种类型,并且它本身也总是在同一个对象上,所以更少的内存消耗和更好的性能,因为不需要复制或创建类型?
    • *d = *(*Date)(&t) 以类型安全的方式将 d 指向的值设置为 t 的值。
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多