protoc生成值而不是指针(Go)

时间:2020-06-18 16:07:30

标签: go protocol-buffers protoc grpc-go

问题:

我在根目录中有2个文件。 我使用Makefile从.proto文件生成Go代码。

但是Video结构中的language字段是一个值,而不是指向该值的指针。 并且Video结构中的subtitles字段是一个值数组,而不是指向该值的指针数组。

问题是:

如何使协议生成指向该值的指针?

video.pb.go

type Video struct {
    state protoimpl.MessageState
    sizeCache protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Id        string              `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
    Title     string              `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`

    // I need *language.ISO639_1 below
    Languages language.ISO639_1   `protobuf:"varint,3,opt,name=languages,proto3,enum=language.ISO639_1" json:"languages,omitempty"`

    // I need []*language.ISO639_1 below
    Subtitles []language.ISO639_1 `protobuf:"varint,4,rep,packed,name=subtitles,proto3,enum=language.ISO639_1" json:"subtitles,omitempty"`
}

Makefile

gen:
   # Video
   protoc -I. --go_out=plugins=grpc,paths=source_relative:video video.proto

   # Language
   protoc -I. --go_out=plugins=grpc,paths=source_relative:language language.proto

language.proto

syntax = "proto3";

package language;

option go_package = "example.com/group/repo/language;language";

enum ISO639_1 {
    UNKNOWN = 0;
    zh      = 1;
}

video.proto

syntax = "proto3";

package video;

import "language.proto";

option go_package = "example.com/group/repo/video;video";

message Video {
             string            id        = 1;
             string            title     = 2;
             language.ISO639_1 language  = 3;
    repeated language.ISO639_1 subtitles = 4;
}

协议版本:libprotoc 3.11.4

1 个答案:

答案 0 :(得分:1)

proto3版本3.12开始,实验性地支持字段存在功能,这意味着您可以再次使用optional关键字,类似于proto2

您可以通过在生成--experimental_allow_proto3_optional文件时向protoc传递一个标志pb.go来实现此目的(确保您正在运行足够新的protoc和{{1 }}以支持此实验功能。

给定这个伪protoc-gen-go文件:

.proto

您应该使用以下内容生成结构体:

enum ISO639_1 {
    UNKNOWN = 0;
    zh      = 1;
}

message Video {
    string            id        = 1;
    string            title     = 2;

    optional ISO639_1 language  = 3;
    repeated ISO639_1 subtitles = 4;
}

虽然这可以解决type Video struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Language *ISO639_1 `protobuf:"varint,3,opt,name=language,proto3,enum=grpctrace.ISO639_1,oneof" json:"language,omitempty"` Subtitles []ISO639_1 `protobuf:"varint,4,rep,packed,name=subtitles,proto3,enum=grpctrace.ISO639_1" json:"subtitles,omitempty"` } 的问题,但我不确定您是否可以解决language字段来获取指针值。也许该线程可能有用-https://stackoverflow.com/a/25637833/13183366