我在协议缓冲区的结构中定义了以下内容: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,
}
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
正如你拥有的那样
*res.CurentTime = time.Now()
将首先取消引用res.CurentTime
(这就是*
此处所做的),如果是nil
,将立即出现恐慌。之后发生什么并不重要。相反,您需要分配一个指针,而不是为现有的 ( nil
) 指针分配新值:
now := time.Now() res.CurentTime = &now
- 2 回答
- 0 关注
- 162 浏览
添加回答
举报
0/150
提交
取消