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 内容。您将在您的特定平台中反序列化它,并获取第一个(通常是唯一的)文件。对于此反序列化步骤,您通常会使用 protocdescriptor.proto 架构作为输入,以获得该架构的 platform/language-specific 解析器。

特定于平台的 runtime/library 解析器并不常见,而且往往在第 3 方工具中更常见; Google golang protobuf 实现是第一方的,golang AFAIK 不存在这样的解析器。