我有一个结构,其中一个字段被声明为字符串,但它旨在存储一个时间。因此,我将其更改为*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.Date
的Record
(因此无需将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 }
它适用于任何类型的(好吧,到目前为止我尝试过的所有类型!例如string
和time.Time
。
你也可以在github上使用lo包的ToPtr()
功能(在我写这篇文章时超过9k星)。这同样有效,你可以写ptr := lo.ToPtr("hello world")
(go编译器能够推断T
为字符串,所以不需要指定它,这与lo包文档中出现的许多示例相反)。