Protocol Buffers Go 代码生成指南
本主题准确描述了协议缓冲区编译器为任何给定的协议定义生成的Go代码。
编译器调用
协议缓冲区编译器需要一个插件来生成Go 代码。使用Go 1.16或更高版本安装,方法是运行:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
这将在
G
O
B
I
N
中按照一个
p
r
o
t
o
c
g
e
n
g
o
的二进制文件。设置
GOBIN 中按照一个protoc gen go 的二进制文件。设置
GOBIN中按照一个protocgengo的二进制文件。设置GOBIN环境变量以更改安装位置。它必须在$PATH中,协议缓冲区编译器才能找到它。
当使用Go_out 标志调用时,协议缓冲区编译器会产生Go输出。go_out标志的参数是希望编译器编写go输出的目录。编译器为每个.proto 文件输入创建一个源文件。输出文件的名称是通过将.proto扩展名替换为.pb.go来创建的。
生成的.pb.go 文件在输出目录中的位置取决于编译器标志。有几种输出模式:
如果指定了paths=import标志,则输出文件将放置在以Go包的导入路径命名的目录中。例如,Go导入路径为example.com/project/protos/fizz的输入文件protos/buzz.proto会在example.com/project-protos/fizz/pzz.pb.Go中生成一个输出文件。如果未指定路径标志,这是默认的输出模式。
生成的.pb.go文件在输出目录中的位置取决于编译器标志。有几种输出模式:
如果指定了paths=import标志,则输出文件将放置在以Go包的导入路径命名的目录中。例如,Go导入路径为example.com/project/protos/fizz的输入文件protos/buzz.proto会在example.com/project-protos/fizz/pzz.pb.Go中生成一个输出文件。如果未指定路径标志,这是默认的输出模式。
如果指定了module=$PREFIX标志,则输出文件将被放置在以Go 包的导入路径命名的目录中,但指定的目录前缀将从输出文件名中删除。例如,输入文件protos/buzz.proto的Go导入路径为example.com/project/protos/fizz,并将example.com/fizz/pzz.pb.Go处生成输出文件。在模块路径之外生成任何Go包都会导致错位,此模式对于将生成的文件直接输出到Go模块非常有用。
如果指定了path=source_relative标志,则输出文件将与输入文件放置在相同的相对目录中。例如,一个输入文件protos/buzz.proto会在protos/buzz.pb.go中产生一个输出文件。
特定于protoc gen go的标志是通过在调用protoc时传递go_opt标志来提供的。可以传递多个go_opt标志。例如,在运行时:
protoc --proto_path=src --go_out=out --go_opt=paths=source_relative foo.proto bar/baz.proto
编译器将从src目录中读取输入文件foo.proto和bar/baz.proto,并将输出文件foo.pb.go和bar/baza.pb.go写入out目录。如果需要,编译器会自动创建嵌套的输出子目录,但不会创建输出目录本身。