time.Time:指针或值

时间:2014-02-27 16:12:43

标签: pointers time go

Go docs say(强调补充):

  

使用时间的程序通常应存储作为值,而不是指针。也就是说,时间变量和结构字段的类型应为time.Time,而不是* time.Time。多个goroutine可以同时使用Time值。

最后一句话(关于在多个goroutine中同时使用Time值)唯一的原因是它们应该“通常”存储并作为值而不是指针传递?这对其他结构也是常见的吗?我尝试在time.Time declaration and methods中寻找专门启用此功能的逻辑,但没有发现任何特殊的逻辑。

更新:我经常需要为我的结构提供JSON表示,而我宁愿省略空/未初始化的时间。 json:",omitempty"标记不适用于time {时间值,appears to be the expected behavior,但最好的解决方法似乎是使用指针,这违反了上面引用的文档中的建议。

1 个答案:

答案 0 :(得分:5)

许多简单的价值观都很常见。

在Go中,当某个值不大于一个或两个单词时,通常只需将其用作值而不是使用指针。只是因为没有理由在对象很小的情况下使用指针而你没有通过它来进行更改。

您可能不得不忘记语言的做法,其中所有结构化都无法作为值处理。你可能很自然地使用整数或浮点数作为值,而不是指针。为什么不这样做呢?

关于JSON的精确问题,并假设您不想为此编写特定的Marshaller,使用*time.Time没有问题。实际上这个问题已经mentioned in the golang-nuts list