将 time.Date 分配给 *time.Time 指针以测试 JSON 反序列化

Assign a time.Date to a *time.Time pointer to test a JSON deserialization

我有一个结构,其中一个字段被声明为字符串,但它用于存储时间。因此我将其更改为 *time.Time (see the commit), note the use of a pointer to bypass the issue where ",omitempty" doesn't really omit the value in case of an blank date.

到目前为止一切顺利。问题是现在我正在尝试编写代码来测试 JSON 字符串的正确反序列化,但我无法将结果与

进行比较
want := Record{Id: 1539, UpdatedAt: time.Date(2014, 01, 15, 22, 03, 04, 0, time.UTC)}

因为 UpdatedAt 应该是一个指针 *time.Time,而 time.Date returns 一个 time.Time.

我不会用

want := Record{Id: 1539, UpdatedAt: &time.Date(2014, 01, 15, 22, 03, 04, 0, time.UTC)}

因为它确实被拒绝了(它期待一个指针,我尝试分配一个结构)

cannot take the address of time.Date(2014, 1, 15, 22, 3, 3, 0, time.UTC)

这是我的问题。有没有一种方法可以动态创建带有 time.DateRecord(因此无需将 time.Date 分配给变量然后获取指针)and/or 的解决方法当对象为 serialized/deserialized 且日期为空时,保证我可以分配适当的 nil 值的问题?

您不能获取函数 return 值的地址,因为您只能获取可分配给的地址。

这样想:如果将结果存储在变量中,则可以获取该变量的地址,但如果不这样做,则无法从中获取地址。

您想先将日期值存储在一个变量中,然后再使用该变量的指针。

myDate := time.Date(2014, 01, 15, 22, 03, 04, 0, time.UTC)
want := Record{Id: 1539, UpdatedAt: &myDate}

仅作记录,您可以定义如下函数:

func toTimePtr(t time.Time) *time.Time {
    return &t
}

然后这样做:

want := Record{Id: 1539, UpdatedAt: toTimePtr(time.Date(2014, 01, 15, 22, 03, 04, 0, time.UTC))}