如何使用* 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]

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

zgwl369 回答:如何使用* time.Time在协议缓冲区的结构中声明

Go的time.Time是带有non-public fields的结构,不能直接通过协议缓冲区发送。

相反,将所有time.Time值转换为Google的protobuf时间类型。 (在幕后,这是一个简单的unixtime,即自1970年以来的秒,加上具有 NO 时区信息-see here的纳秒)

例如,在您的.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
本文链接:https://www.f2er.com/3114383.html

大家都在问