gpt4 book ai didi

go - 复合类型和指针方法

转载 作者:IT王子 更新时间:2023-10-29 01:11:38 26 4
gpt4 key购买 nike

我在基于类型 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 数据存储区中。编码本身也有效,但不起作用的是:然后当从 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 类型的包装器。

有更好的解决方案吗?我还很陌生。

我需要这个 Date 类型,只有一个 json 格式的 Date 类型,因为 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
}

关于go - 复合类型和指针方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com