【问题标题】:time.Time: pointer or valuetime.Time:指针或值
【发布时间】:2014-02-27 16:12:42
【问题描述】:

Go docs say(已添加重点):

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

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

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

【问题讨论】:

    标签: pointers time go


    【解决方案1】:

    这对于许多简单的值都很常见。

    在 Go 中,当某个值不大于一两个单词时,通常将其简单地用作值而不是使用指针。仅仅是因为如果对象很小并且您没有将其传递给进行更改,则没有理由使用指针。

    您可能不得不忘记语言的实践,其中所有结构化的东西都不能作为值来处理。您可能很自然地将整数或浮点数用作值,而不是指针。为什么不多次这样做?

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

    【讨论】:

    • 好点。我问的一个原因是我经常必须为我的结构提供 JSON 表示,我宁愿省略空/未初始化的时间。由于 json:",omitempty" 标记不适用于 time.Time 值,因此我一直在使用指针。我会更新我的问题以提及这一点。
    • 在您的情况下,如果您需要防止空时间被转储到 JSON 中并且您不想覆盖编组器,那么我认为使用指针没有真正的问题。
    猜你喜欢
    • 2020-03-10
    • 2019-09-27
    • 2013-01-03
    • 1970-01-01
    • 2015-04-14
    • 2016-10-08
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多