Go 如何使用在协议缓冲区的结构中声明的*time.time

Go 如何使用在协议缓冲区的结构中声明的*time.time,go,protocol-buffers,Go,Protocol Buffers,我在协议缓冲区的结构中定义了以下内容: CurentTime *time.Time `protobuf:"bytes,5,opt,name=curent_time,json=curentTime,proto3,stdtime" json:"curent_time,omitempty" 在main.go代码中,我尝试按如下方式分配它: *res.CurentTime=time.Now() 我不断得到以下错误: panic: runtime error

我在协议缓冲区的结构中定义了以下内容:

CurentTime    *time.Time                     `protobuf:"bytes,5,opt,name=curent_time,json=curentTime,proto3,stdtime" json:"curent_time,omitempty"
在main.go代码中,我尝试按如下方式分配它:
*res.CurentTime=time.Now()

我不断得到以下错误:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1642e61]
我相信我做的分配不正确,但我为什么和如何解决这个问题以正确分配,而不使我的系统崩溃?

正如你所说的那样

*res.CurentTime = time.Now()
将首先取消引用
res.CurentTime
(这就是
*
在这里所做的),如果
nil
,它将立即死机。接下来发生什么并不重要。相反,您需要指定一个指针,而不是为现有(
nil
)指针指定一个新值:


Go的
time.time
是一个不能通过协议缓冲区直接发送的结构

而是将任何
time.time
值转换为google的protobuf时间类型。 (在封面下,这是一个简单的unixtime,即自1970年以来的秒加上没有时区信息的纳秒-)

例如,在
.proto
文件中:

syntax = "proto3";

import "google/protobuf/timestamp.proto";

message MyData {
    google.protobuf.Timestamp   updated             = 1;
    google.protobuf.Timestamp   created             = 2;
}
在您的go代码中:

import (
    "time"

    "github.com/golang/protobuf/ptypes"
)

// ...

updatedTime := time.Now()
updatedProto, err := ptypes.TimestampProto(updatedTime)

// ...

mydate := &pb.MyData{
    updated: updatedProto,
}
import (
    "time"

    "github.com/golang/protobuf/ptypes"
)

// ...

updatedTime := time.Now()
updatedProto, err := ptypes.TimestampProto(updatedTime)

// ...

mydate := &pb.MyData{
    updated: updatedProto,
}