为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Qyouu 2023-08-07 10:31:47
我在协议缓冲区的结构中定义了以下内容: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]我相信我的分配不正确,但是为什么以及如何解决这个问题以正确分配而不会使我的系统崩溃?
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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,

}


查看完整回答
反对 回复 2023-08-07
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

正如你拥有的那样

*res.CurentTime = time.Now()

将首先取消引用res.CurentTime(这就是*此处所做的),如果是nil,将立即出现恐慌。之后发生什么并不重要。相反,您需要分配一个指针,而不是为现有的 ( nil) 指针分配新值:

now := time.Now()
res.CurentTime = &now


查看完整回答
反对 回复 2023-08-07
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信