GoLang - 如何将值初始化为 *time.Time

Ayu*_*mar 0 struct pointers go

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

type Payload struct {
    ...
    Timestamp *time.Time  `json:"timestamp,omitempty"`
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

不能使用 time.Now()(time.Time 类型的值)作为结构体中的 *time.Time 值

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

icz*_*cza 5

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

请注意,您也不能获取函数调用返回值的地址,您也不能这样做&time.Now()。详情请参见如何从函数调用中获取返回值的指针?

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

var t = time.Now()

payload:= &device.Payload{
    Timestamp: &t,
}
Run Code Online (Sandbox Code Playgroud)

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

func timePtr(t time.Time) *time.Time {
    return &t
}

payload:= &device.Payload{
    Timestamp: timePtr(time.Now()),
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息和其他选项,请参阅如何在 Go 中执行文字 *int64?

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