网站首页 > 博客文章 正文
在上一篇中(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斤了)。
猜你喜欢
- 2025-01-13 gRPC Java入门示例
- 2025-01-13 Netflix 实用 API 设计第 1 部分:使用 Protobuf FieldMask
- 2025-01-13 netty系列之:使用Jboss Marshalling来序列化java对象
- 2025-01-13 避免重复造轮子,Java 程序员必备
- 2025-01-13 Avro、Protobuf和Thrift中的模式演变
- 2025-01-13 Netty 使用 Google 的 ProtoBuf 来传输数据
- 2025-01-13 自己动手从0开始实现一个分布式 RPC 框架
- 2025-01-13 Google Protobuf vs. Apache Avro
- 2025-01-13 比较序列化Kryo 和 Protobuf性能
- 2025-01-13 protobuf和其它几种序列化工具的性能对比分析
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)