登录
首页 >  Golang >  Go问答

在golang中手动生成.pb文件

来源:stackoverflow

时间:2024-02-17 18:15:24 488浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《在golang中手动生成.pb文件》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我正在尝试使用 service.proto 作为 Go 中的文件输入来生成 .pb.go 文件。

有没有办法在不使用 protoc 二进制文件的情况下完成此操作(例如直接使用包 github.com/golang/protobuf/protoc-gen-go)?


正确答案


如果你有一个像这样的 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 的 pull 请求:

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

理论要掌握,实操不能落!以上关于《在golang中手动生成.pb文件》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>