编程技术分享平台

网站首页 > 技术教程 正文

10.2 protobuf (golang中如何生成代码呢?)

xnh888 2025-01-08 18:15:48 技术教程 28 ℃ 0 评论

在上一篇中(10.1 protobuf (一个高效的结构化存储格式)),我学习了protobuf的结构定义,但是到底如何使用呢?这是一个问题。也就是我们如何将这些proto文件转换成对应语言的代码呢?尤其是我最近在学习golang,总得让我用起来吧。

其实,官方已经给我们提供得转换工具protoc,下面是官方提供的转换包地址。

https://github.com/protocolbuffers/protobuf/releases


因为我是在windows平台上盘它,所以我下载了protoc-29.1-win64.zip(当然你想自行编译,也可以下载源码包)。

好了解压一下:


bin目录下载的protoc.exe就是我们需要的生成代码的工具喽,我把它拷贝到GOPATH目录下去,嘿嘿,我就可以直接用了。

我们先看看我定义的proto文件目录


好了!执行命令:


奇怪,为什么不行呢?怎么还执行了一个protoc-gen-go了呢?什么情况?

我记得我以前作为java开发者的时候,直接就可以用呀?

我试试Java的执行。


java的生成代码执行成功了呀。

赶快看看啥情况?

呃呃呃。明白了,原生的protoc.exe支持的生成代码是有限的,比如:java, c#,python,c++这些,估计这些语言使用群体太广泛了吧。而golang并没有原生支持。可能觉得麻烦吧,于是protoc提供了一个插件系统,比如golang就提供了一个,在命令行中的--xxx_out这个参数就是针对要执行的类型的,比如你使用--go_out,因为它没有原生的支持,于是它要去找当前目录下有没有一个叫做protoc-gen-go的插件执行文件。当然如果你是--xxx_out,它就会去找proto-gen-xxx的插件执行文件了。(其实这个插件系统是相当的棒的,如果你有特殊的需求,可以自定义生成代码的结构。比如我就一直想自定义一套rpc的生成代码规则。)

既然知道原因了,那我们就先找找golang的protoc-gen-go的插件吧。

go install google.golang.org/protobuf/cmd/protoc-gen-go

上面正是我们想要的这个插件。开始执行安装吧。

执行完成后,看看GOPATH目录下有没有。

真棒。有了耶。

好了,继续执行我们的命令吧。


完美生成成功。还是很顺利的完成了。

看看它的代码结构


代码太多了,就截几张重要的吧。我们可以看出来,它根据proto定义文件生成了符合golang语言规范的代码。比如枚举它生成了常量和对应的索引和字符串对应关系。message就是对应了golang的结构体。(看这个tag,它还支持序列化成json耶!!!)

都学到这里了,咱们还是看看生成的代码到底该怎么用呢?总得把这些结构体序列化或者反序列化吧?嘿嘿,果然protobuf给我们提供了使用库。

go get -u google.golang.org/protobuf/proto

有了这个使用库,我们就可以序列化反序列化它呢

测试一下。

写个简单的序列化/反序列化代码吧

开始执行:

这就是一个在golang中使用protobuf的例子了。

其实,我只是学了一个皮毛,实际使用其他的地方还有很多。比如在消息接收的过程中,需要根据消息号确认应该使用哪个消息结构体,这个时候会涉及到根据消息号找到结构体,然后反射成对应的消息体,这里是有相应的使用的(就是在分发器里面需要用到),如下:


这是protobuf提供的库接口。如果你仔细看生成的代码,其实每个代码结构体都有这个实现。

比如ReqLogin

protobuf还需要深入研究。如果我后面再搞明白了一些,会继续写相关的学习文章的。

好了,又到了晚上了。一个不想加班的无业程序员需要去思考人生了(去看40年前的自我治愈电视剧《北国之恋》,因为最近焦虑瘦了12斤了)。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表