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,
}