为 protobuf 类型导入范围查找

Go import scope lookup for protobuf types

我正在构建一个转译器,需要了解 protobuf/go 作用域查找系统。我一直在尝试 google 文档,但没有成功。

问:在 Go/protobufs 中导入类型时,是否可以进行共享包范围查找?

这是我要质疑的例子:

proto1:

package cosmos.crypto.keyring.v1;
...

message Ledger {
    hd.v1.BIP44Params path = 1;
}

proto2:

package cosmos.crypto.hd.v1;
message BIP44Params {
    ...
}

到目前为止,我看到有两种语法确实有意义:

全部范围

message Ledger {
    cosmos.crypto.hd.v1.BIP44Params path = 1;
}

或者我也见过这样的版本

完全没有作用域

message Ledger {
   BIP44Params path = 1;
}

部分范围?

但我看到的样式是部分范围的

message Ledger {
    hd.v1.BIP44Params path = 1;
}

他们放弃 cosmos.crypto 的原因是因为这两个软件包在其软件包名称的根目录中共享 cosmos.crypto 吗?

还是基于导入的更通用的范围查找?

感谢任何见解或阅读链接:)

我不确定我是否完全理解问题,但我会尽力回答。如果您需要我更改它,请告诉我。

这是两者的结合。您需要拥有包并导入 .proto 文件。让我解释。如果你有两个文件定义如下:

proto1.proto

syntax = "proto3";
package cosmos.crypto.keyring.v1;

message Ledger {
    hd.v1.BIP44Params path = 1;
}

proto2.proto

syntax = "proto3";
package cosmos.crypto.hd.v1;

message BIP44Params {}

尝试编译会告诉你 "hd.v1.BIP44Params" is not defined。这是因为 proto1.proto 不知道其他定义。现在,如果您在 proto1.protoimport "proto2.proto";,它将知道 BIP44Params 定义并会注意到包定义。

有了这个包定义,它将能够访问以下类型定义:

  • cosmos.crypto.hd.v1.BIP44Params - 不言自明
  • hd.v1.BIP44Params - 因为两个包在 hd 部分之前匹配。

但应该可以访问:

  • BIP44Params - 因为在 cosmos.crypto.keyring.v1
  • 中没有定义这样的类型

希望清楚