1

我正在尝试.pb.go使用service.protoGo 中的文件输入生成文件。

有没有办法在不使用protoc二进制的情况下做到这一点(比如直接使用 package github.com/golang/protobuf/protoc-gen-go)?

4

1 回答 1

3

如果你有detail.proto这样的:

message AppDetails {
   optional string version = 4;
}

您可以将其解析为如下消息:

package main

import (
   "fmt"
   "github.com/golang/protobuf/proto"
   "github.com/jhump/protoreflect/desc/protoparse"
   "github.com/jhump/protoreflect/dynamic"
)

func parse(file, msg string) (*dynamic.Message, error) {
   var p protoparse.Parser
   fd, err := p.ParseFiles(file)
   if err != nil {
      return nil, err
   }
   md := fd[0].FindMessage(msg)
   return dynamic.NewMessage(md), nil
}

func main() {
   b := []byte("\"\vhello world")
   m, err := parse("detail.proto", "AppDetails")
   if err != nil {
      panic(err)
   }
   if err := proto.Unmarshal(b, m); err != nil {
      panic(err)
   }
   fmt.Println(m) // version:"hello world"
}

但是你可能会注意到,这个包仍然使用旧的 Protobuf V1。我确实找到了 V2 的拉取请求:

https://github.com/jhump/protoreflect/pull/354

于 2021-05-28T16:33:18.790 回答