我正在构建一个transpiler,需要了解protobuf/go范围查找系统.我一直在用谷歌搜索这些文档,却没有发现任何运气.

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

下面是我质疑的一个例子:

协议1:

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

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

协议2:

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吗?

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

任何见解或阅读链接,敬请欣赏:)

推荐答案

我不确定我是否完全理解这个问题,但我会尽力回答.如果你需要我改变,请告诉我.

这是两者的结合.你需要有这个包,然后导入文件.原始文件.让我解释一下.如果有两个文件,请这样定义:

proto1.因此

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

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

proto2.因此

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

message BIP44Params {}

try 编译会告诉你"hd.v1.BIP44Params" is not defined.这是因为proto1.因此不知道其他定义.现在,如果您在proto1.因此中输入import "proto2.因此";,它将知道BIP44Params定义,并将注意到包定义.

使用此包定义,它将能够访问以下类型定义:

  • cosmos.crypto.hd.v1.BIP44Params-这是不言而喻的
  • hd.v1.BIP44Params-因为这两个包在hd部分之前匹配.

但它应该能够访问:

  • BIP44Params-因为cosmos.crypto.keyring.v1包中没有定义此类类型

希望这是清楚的

Go相关问答推荐

Golang API 的 HTTPS

测试包外文件时的 Golang 测试覆盖率

处理程序中的无限循环

Go Flag 用法 描述 包含 Word 值

gopls 为 github.com/Shopify/sarama 返回错误“gopls: no packages returned: packages.Load error”

Go:为“一组”单个结果实现 ManyDecode

如何从应用程序调用谷歌云身份 API

Gin中测试模式有什么用

Golang 与 Cassandra db 使用 docker-compose:cannot connect (gocql)

在 Go 泛型中,如何对联合约束中的类型使用通用方法?

未定义:grpc.SupportPackageIsVersion7 grpc.ServiceRegistrar

go module @latest 找到但不包含包

errors.Wrapf()、errors.Errorf() 和 fmt.Errorf() 之间有什么区别?

将元素添加到 Go AST 后乱序

从 Go 1.13 升级后使用 Go 1.14 构建时,是什么导致了关于“previous declaration at”的运行时内部错误?

VSCode:无法导入 Golang 包

如何设置 GOPRIVATE 环境变量

通过 Go 中的反射检测空值的快速方法

go.mod 中的“ incompatible”是什么意思?

如何使用 go modules 删除已安装的包