猿问

如何使用在protocol buffer结构体中声明的*time.Time

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

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]

我相信我的分配不正确,但是为什么以及如何解决这个问题以正确分配而不会使我的系统崩溃?


Qyouu
浏览 163回答 2
2回答

繁花不似锦

Go是一个具有非公共字段的time.Time结构,不能直接通过协议缓冲区发送。相反,将任何time.Time值转换为 google 的 protobuf 时间类型。)例如,在您的.proto文件中:syntax = "proto3";import "google/protobuf/timestamp.proto";message MyData {    google.protobuf.Timestamp   updated             = 1;    google.protobuf.Timestamp   created             = 2;}在你的代码中:import (    "time"    "github.com/golang/protobuf/ptypes")// ...updatedTime := time.Now()updatedProto, err := ptypes.TimestampProto(updatedTime)// ...mydate := &pb.MyData{    updated: updatedProto,}

慕尼黑的夜晚无繁华

正如你拥有的那样*res.CurentTime = time.Now()将首先取消引用res.CurentTime(这就是*此处所做的),如果是nil,将立即出现恐慌。之后发生什么并不重要。相反,您需要分配一个指针,而不是为现有的 ( nil) 指针分配新值:now := time.Now() res.CurentTime = &now
随时随地看视频慕课网APP

相关分类

Go
我要回答