Proto3 结合 Go 开发时是否支持 optional 字段?
Proto3 在 Go 语言中对 optional 字段的支持问题
首先明确说:Proto3 现在是支持 optional 关键字的,你遇到报错的核心原因是工具版本不匹配。
为什么会报错?
你用的 --experimental_allow_proto3_optional 是早期 Protobuf 为测试 proto3 optional 功能添加的临时参数,而你的 protoc-gen-go 版本太老,还没适配正式的 proto3 optional 支持。在 Protobuf 3.12 版本之后,optional 已经成为 proto3 的正式特性,不需要再用这个 experimental 参数了,旧版本的代码生成器自然会抛出错误。
解决步骤
要顺利使用 proto3 的 optional 字段,你需要完成以下操作:
- 升级 protoc 编译器:确保你的 protoc 版本在 3.12 及以上(建议直接更新到最新稳定版)。
- 升级 protoc-gen-go:执行下面的命令安装最新版本的 Go 代码生成器:
安装完成后,可以用go install google.golang.org/protobuf/cmd/protoc-gen-go@latestprotoc-gen-go --version确认版本,至少要在 v1.20.0 以上(这个版本开始正式支持 proto3 optional)。 - 重新编译 proto 文件:去掉那个 experimental 参数,直接用常规命令编译:
protoc person.proto --go_out=.
额外说明
如果你的项目依赖旧版本的 Protobuf 工具链,实在无法升级,那可能需要继续使用 --experimental_allow_proto3_optional,但同时要搭配适配这个参数的旧版 protoc-gen-go(比如 v1.19.x 及之前的某些版本),但这种方案不推荐,因为临时参数后续可能被移除,而且正式版本的支持更稳定。
内容的提问来源于stack exchange,提问作者Khushi
相关产品推荐
相关产品推荐

