分配时间.日期为 * 时间.用于测试 JSON 反序列化的时间指针



我有一个结构,其中一个字段被声明为字符串,但它旨在存储一个时间。因此,我将其更改为*time.Time(请参阅提交),请注意使用指针来绕过",omitempty"在空白日期的情况下并没有真正省略该值的问题。

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

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

因为UpdatedAt应该是指针*time.Time,而time.Date返回一个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分配给变量然后获取指针)和/或问题的解决方法,以保证我可以在对象序列化/反序列化并且日期为空时分配适当的 nil 值?

您不能获取函数返回值的地址,因为您只能获取可以分配给的内容的地址。

可以这样想:如果你将结果存储在变量中,那么你就可以获取该变量的地址,但如果你不这样做,那么你就没有任何东西可以从中获取地址。

您希望先将日期值存储在变量中,然后使用该变量的指针。

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))}

你不能获取文字的地址,因为它们被内联到代码中(至少这是我目前对原因的理解)。

我的测试代码中经常有以下内容:

func literalAddressProvider[T any](s T) *T { return &s }

它适用于任何类型的(好吧,到目前为止我尝试过的所有类型!例如stringtime.Time

你也可以在github上使用lo包的ToPtr()功能(在我写这篇文章时超过9k星)。这同样有效,你可以写ptr := lo.ToPtr("hello world")(go编译器能够推断T为字符串,所以不需要指定它,这与lo包文档中出现的许多示例相反)。

最新更新