如何将Proto3中Person的Action字段编译为Go非指针结构体?
解决Proto3编译Go生成非指针消息字段的问题
默认行为原因
Proto3 中,消息类型的字段默认是可选的,编译为 Go 指针类型是为了区分「字段未被设置」和「字段被设置为默认值」(比如空的 Action 实例)。
实现方案
要生成非指针类型的字段,需要借助 gogo/protobuf 第三方插件的自定义扩展选项:
- 安装gogo/protobuf工具
go get github.com/gogo/protobuf/protoc-gen-gogofast
- 修改Proto文件
引入gogo的扩展定义,给目标字段添加(gogoproto.nullable) = false标记:
syntax = "proto3"; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; message Action { } message Person { Action action = 1 [(gogoproto.nullable) = false]; }
- 用gogofast插件编译
protoc --gogofast_out=. your_proto_file.proto
编译结果
生成的Go代码中,Person 的 action 字段会是非指针类型:
type Person struct { Action Action `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` }
注意:使用该选项后,无法再通过指针 nil 判断字段是否被主动设置过,仅适用于无需区分「未设置」和「默认值」的业务场景。
内容的提问来源于stack exchange,提问作者Ashank Singh
相关产品推荐
相关产品推荐

