网站首页 > 技术教程 正文
在上一篇中(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斤了)。
- 上一篇: 面试系列 - 序列化和反序列化详解
- 下一篇: 详细介绍一下Java的序列化和反序列化操作?
猜你喜欢
- 2025-01-08 【AI系统】推理文件格式
- 2025-01-08 分布式RPC最全详解(图文全面总结)
- 2025-01-08 Avro、Protobuf和Thrift中的模式演变
- 2025-01-08 《STM32 HAL库》中断相关函数详尽解析——外部中断服务函数
- 2025-01-08 分布式通讯中三大框架protobuf,thrift,fast比较
- 2025-01-08 Go语言核心36讲(Go语言实战与应用二十七)--学习笔记
- 2025-01-08 如何对 Android 库进行依赖管理?
- 2025-01-08 详细介绍一下Java的序列化和反序列化操作?
- 2025-01-08 面试系列 - 序列化和反序列化详解
- 2025-01-08 工业通讯(101)---网络库DotNetty入门
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)