协议缓冲区文件中使用的 go_package 选项是什么?

What is the go_package option used for in a protocol buffer file?

我做了一些研究,包括查看来自 google 的官方文档,但我找不到对 go_package 选项的用途的很好解释。官方文档说明如下:

The .proto file should contain a go_package option specifying the full import path of the Go package that contains the generated code.

我想我对导入路径的含义感到困惑。这听起来更像是一个导出路径,因为我们想把生成的代码放在哪里?但是,如果我们可以在 --go_out= 期间指定输出路径,为什么我们需要这个?所以我无法理解为什么你需要在 proto 文件中指定导出路径,同时在 option go_package?

中指定输出路径

声明生成代码的预期导入路径对于其他 protobuf 文件了解如何在生成的代码中引用这些类型很重要。

如果您的所有 protobuf 定义都在单个 .proto 文件中声明,则导入路径意义不大,因为它们隐式共享同一个 go 包。如果你在多个包中启动 storing/generating protobuf 文件,它们需要知道如何找到彼此。

查看“众所周知”类型的 protobuf 就是一个很好的例子:

https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/timestamp.proto

该文件的顶部包含以下包声明:

option go_package = "google.golang.org/protobuf/types/known/timestamppb";

如果我在另一个 protobuf 文件中使用该消息:

import "google/protobuf/timestamp.proto";

message MyModel {
   google.protobuf.Timestamp ts = 1;
}

我为 MyModel 生成的文件将在 .pb.go 文件的顶部包含一个导入语句,如下所示:

import timestamppb "google.golang.org/protobuf/types/known/timestamppb"