【问题标题】:GoLang - How to initialize value to *time.TimeGoLang - 如何将值初始化为 *time.Time
【发布时间】:2021-10-30 09:17:15
【问题描述】:

我在一些 device.go 文件中定义了一个结构

type Payload struct {
    ...
    Timestamp *time.Time  `json:"timestamp,omitempty"`
    ...
}

现在我想在其他文件中初始化这个结构,我正在尝试这个:

payload:= &device.Payload{
    ....
    Timestamp: time.Now(), // throws error
    ... //other initializations work fine
}

不能使用 time.Now()(time.Time 类型的值)作为 *time.Time 值 结构字面量

我想将变量初始化为当前的 UTC 时间。我是golang的新手。我该怎么做?

【问题讨论】:

    标签: go pointers struct


    【解决方案1】:

    time.Now() 返回一个time.Time 类型的值,它不是*time.Time

    注意,你也不能取函数调用的返回值的地址,你也不能做&time.Now()。详情见How to get the pointer of return value from function call?

    您可以使用time.Time 类型的变量并获取其地址:

    var t = time.Now()
    
    payload:= &device.Payload{
        Timestamp: &t,
    }
    

    另一个“流行”选项是创建一个辅助函数来返回time.Time 值的地址(您可以将函数调用的返回值直接传递给该值):

    func timePtr(t time.Time) *time.Time {
        return &t
    }
    
    payload:= &device.Payload{
        Timestamp: timePtr(time.Now()),
    }
    

    有关详细信息和其他选项,请参阅How do I do a literal *int64 in Go?

    我假设您想要一个指针,因为您希望允许“丢失时间”选项,这是 encoding/json 包尊重“丢失时间”所必需的(详细信息:JSON omitempty With time.Time Field)。请注意,在其他情况下,可能不需要自动转向指针:您可以使用time.Time(它是一个结构)的零值来指示“错过时间”状态。要轻松判断time.Time 是否为零值,您可以使用Time.IsZero()。见相关:Idiomatic way to represent optional time.Time in a struct

    【讨论】:

      【解决方案2】:

      time.Now() 返回一个 Time 值,但您的结构正在寻找一个指针。将您的结构更改为

      type Payload struct {
          ...
          Timestamp time.Time  `json:"timestamp,omitempty"`
          ...
      }
      

      来自文档 (https://pkg.go.dev/time#Time):

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

      【讨论】:

        猜你喜欢
        • 2021-01-23
        • 2021-12-17
        • 1970-01-01
        • 2019-01-11
        • 2022-06-29
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多