gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:09:51 25 4
gpt4 key购买 nike

问题:

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

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

问题是:

如何让 protoc 生成指向该值的指针?

视频.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"`
}

生成文件
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

语言.proto
syntax = "proto3";

package language;

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

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

视频.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;
}

协议(protocol)版本:libprotoc 3.11.4

最佳答案

proto3 开始3.12 版,实验性支持现场显示功能,这意味着您可以再次使用 optional关键字,类似于 proto2 .
您可以通过传递标志 --experimental_allow_proto3_optional 来实现此目的。至protoc生成 pb.go 时文件(确保您正在运行足够新版本的 protocprotoc-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 ,我不确定您能否解决 repeated字段,获取指针值。也许这个线程可能会有所帮助 - https://stackoverflow.com/a/25637833/13183366

关于go - protoc 生成值而不是指针(Go),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62454396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com