问题:
我在根目录中有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
答案 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