golang中如何将.proto文件解析成FileDescriptor?
how to parse .proto file into FileDescriptor in golang?
我的目标是从 .proto 文件动态获取 FileDescriptor,我应该怎么做?
输入:
syntax = "proto3";
package "halo";
message SearchRequest {
string query = 1;
string data = 2;
}
输出:
import "google.golang.org/protobuf/types/descriptorpb"
descriptorpb.FileDescriptorProto{
Package: "halo",
MessageType: []{
descriptorpb.DescriptorProto{query},
descriptorpb.DescriptorProto{data},
}
}
除非您的平台存在特定于平台的 runtime/library 解析器,否则最简单的方法是使用 protoc
和 -oFILE
/ --descriptor_set_out=FILE
选项,它解析模式并输出一个 protobuf 有效负载,它是序列化的 FileDescriptorSet
内容。您将在您的特定平台中反序列化它,并获取第一个(通常是唯一的)文件。对于此反序列化步骤,您通常会使用 protoc
和 descriptor.proto 架构作为输入,以获得该架构的 platform/language-specific 解析器。
特定于平台的 runtime/library 解析器并不常见,而且往往在第 3 方工具中更常见; Google golang protobuf 实现是第一方的,golang AFAIK 不存在这样的解析器。
我的目标是从 .proto 文件动态获取 FileDescriptor,我应该怎么做?
输入:
syntax = "proto3";
package "halo";
message SearchRequest {
string query = 1;
string data = 2;
}
输出:
import "google.golang.org/protobuf/types/descriptorpb"
descriptorpb.FileDescriptorProto{
Package: "halo",
MessageType: []{
descriptorpb.DescriptorProto{query},
descriptorpb.DescriptorProto{data},
}
}
除非您的平台存在特定于平台的 runtime/library 解析器,否则最简单的方法是使用 protoc
和 -oFILE
/ --descriptor_set_out=FILE
选项,它解析模式并输出一个 protobuf 有效负载,它是序列化的 FileDescriptorSet
内容。您将在您的特定平台中反序列化它,并获取第一个(通常是唯一的)文件。对于此反序列化步骤,您通常会使用 protoc
和 descriptor.proto 架构作为输入,以获得该架构的 platform/language-specific 解析器。
特定于平台的 runtime/library 解析器并不常见,而且往往在第 3 方工具中更常见; Google golang protobuf 实现是第一方的,golang AFAIK 不存在这样的解析器。