gogoprotobuf在windows上遇见的坑
gogoprotobuf在windows上遇见的坑
- 闲话一下
- 准备工作
- 创建你的工程目录
- 生成go文件
- 我们还想要更简洁的代码
- 总结
闲话一下
- 最近打算做一个联网的小游戏,通讯协议决定使用protobuf,之前的工作环境都是在linx下进行开发的,这次我打算从零开始,在windows系统下开发,而这篇文件也主要介绍我如何配置gogoprotobuf的环境,以及期间遇到的问题。不是protobuf么,为何变为gogoprotobuf?因为网上查了下资料,发现gogoprotobuf生成速度比protobuf还要快一些,既然如此为何不用更好的。
准备工作
首先你需要在github上下载github.com/gogo/protobuf和github.com/Knetic/govaluate,没翻墙?下载速度1kb/s?我已经给你们准备好了,之前我下了3个小时,放在我的网盘地址上了(挂了请留言)。
然后你需要一个编译好了的protoc的可执行文件,你可以在github.com/protocolbuffers/protobuf下载源码,然后在本机上编译。也可以直接从官网下载已经生成好了的可执行文件,地址如下github.com/google/protobuf/releases。我这边生成发现少了好多依赖包,节约时间,就自己下了个windows的64位的文件。也放在网盘上的。
网盘地址:https://pan.baidu.com/s/1lnv5F3IFcTcGQBa1nqgijQ
提取码:hi4d
创建你的工程目录
你下载的github.com文件夹拷贝到src目录下,并在src目录下创建一个test文件夹,我的test是我的项目名字,等会我会把proto文件放在这个目录下。
接下来你要编译gogo的protoc-gen-go文件,进入github.com\gogo\protobuf\protoc-gen-gogofast和github.com\gogo\protobuf\protoc-gen-gogo(这里我就选用了这2个),使用go
build命令生成可执行文件。并将生成的文件和protoc.exe一起放入bin目录下。
接下来在我们的test文件夹里创建一个proto文件,并附上内容
syntax = "proto3";
package gameMsg;import "github.com/gogo/protobuf/gogoproto/gogo.proto";//option (gogoproto.goproto_sizecache_all) = false;
//option (gogoproto.goproto_unkeyed_all) = false;
//option (gogoproto.goproto_unrecognized_all) = false;enum TestPid {cInvalid = 0; //无效的消息idcLogin = 1000; //登陆请求cLogout = 1001; //登出请求
}//协议头
message PbTest {option (gogoproto.goproto_getters) = false;string PlayerId = 1; //用户idstring Sign = 2; //签名int32 Tick = 3; //时间戳(秒)
}
生成go文件
如果你对生成的go的格式没有什么要求,把上面的引用gogo.proto注释掉,执行下面的命令就应该行了。而作为有强迫症的我,就只有默默的踩坑。
%GOPATH%\bin\protoc.exe --plugin=protoc-gen-go=%GOPATH%\bin\protoc-gen-gogo.exe --go_out=. base.proto(%GOPATH%你们这个需要自己在环境变量里面改,我这里的是E\gotest,protoc-gen-gogo.exe就是刚才我们生成的文件)
然后报错,具体就是说缺少google/protobuf/descriptor.proto文件,我在目录下一看,确实没这个包,咋办呢?我突然想到了之前gogoproto介绍说兼容了google的proto,那么肯定本地应该有这个文件的,果然不出我的猜想,在github.com\gogo\protobuf\protobuf目录下发现了google文件夹,然后顺腾摸瓜就找到了descriptor.proto文件。
于是我们就改下这个gogo.proto中descriptor.proto的地址吧,在改之前最好拷贝一份,做个备份,万一你的git回滚不了呢
这次我们再试一试,生成go文件成功,这下我们就可以使用这个gameMsg了
我们还想要更简洁的代码
上面的代码被我标注红色的可以看出,这些东西看着是不是很别扭,因为对我而言,我根本用不着这些,我解析都有自己的一套规则,还有加密算法在里面,所以我只需要生成这个结构体部分就行了,多余的部分那就想办法干掉它。
于是通过网上查询,找到了一些取消这个字段的方法,具体不多讲,百度能查到各个字段的意思,有兴趣的朋友可以查查。 option
(gogoproto.goproto_sizecache_all) = false; option
(gogoproto.goproto_unkeyed_all) = false; option
(gogoproto.goproto_unrecognized_all) = false;然后我们看到的效果是果然xxx的字段没有了,但是下面的函数带xxx的还有。
我有时候都怀疑我是金牛座的——犟,查了大量网上资料无果后,咋办?看源码吧,找到它,接近它,干掉它(就是这么暴力)。
最后在github.com/gogo/protobuf/protoc-gen-gogo/generator里找到了XXX_Unmarshal,它是在generateCommonMethods函数里,大致看了一下,这里就是它自动给你生成函数的地方,查看调用的地方,注释了没啥影响,注释掉。
然后重新编译下protoc-gen-gogo.exe吧,编译好了记得替换掉bin目录下的protoc-gen-gogo.exe
然后执行,看看结果,果然不见了,现在是不是看着清爽多了,当然你如果还是想用工具里自带的序列化和反序列化,那你还是保留吧。
总结
工具这东西就是为了让我们使用方便的东西,如果当使用费劲的时候,我们就应该想如何去解决问题,把复杂的东西简单化,提高效率才是我们所不断追求的目标。希望这篇文章能带给那些需要人一些帮助。
gogoprotobuf在windows上遇见的坑相关推荐
- 【吐血经验】在 windows 上安装 spark 遇到的一些坑 | 避坑指南
在 windows 上安装 spark 遇到的一些坑 | 避坑指南 最近有个活:给了我一个阿里云桌面(windows 10系统),让我在上面用 scala + spark 写一些东西. 总是报错不断, ...
- Phalcon在Windows上安装 《Phalcon入坑指南系列 一》
Phalcon入坑指南 本系列目录 前言 一.安装 二.Phalcon 开发工具安装 三.环境变量配置 四.Phalcon 开发工具的使用 生成项目框架 生成控制器 / 模型 夸一下phalcon 五 ...
- windows上Bonjour服务发布的一些坑
windows上Bonjour服务发布的一些坑 1.遇到的问题 单独发布信息从某个网卡上出去后,会出现自动消失,并且有时会跑到另外一张网卡上 DNSServiceRegister注册服务时回调一直未触 ...
- 在 Windows 上测试 Redis Cluster的集群填坑笔记
redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje 集群环境至少需要3个节点.推荐使用6个节点配置,即3个主节点,3个从节点. 新建6个文件夹 ...
- 【Java】Java中的在Linux和Mac以及Windows上使用File.separator的坑
1.在写代码中使用File.separator,作文文件名的分割时,会报如下的错,这是在windows上运行的,但是Linux和Mac上是可以的 2.原因很简单,直接修改 修改为这样就可以了.
- Git学习系列之Windows上安装Git之后的一些配置(图文详解)
不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...
- 如何在 Windows 上安装多个 MySQL,实现 MySQL 跨电脑移植使用
如何在 Windows 上安装多个 MySQL,实现 MySQL 跨电脑移植使用 初次安装 MySQL 移植使用 附录 其它 MySQL 命令 查看本 MySQL 数据存放目录 MySQL 的各种其它 ...
- hadoop2.0以后不需要借助cywin运行在Windows上
Hadoop 2.0及以后的版本可以直接在windows上跑, 不用cygwin了, 凡是讲cygwin的攻略都可以忽略. 去官网下载hadoop,其实都是tar.gz linux版本,所以我们单独下 ...
- sftp方式从windows上传文件到Linux服务器
今天我一直用scp想实现从windows上传文件到Linux服务器,但是鼓捣了半天也没有实现.后来查资料才发现,scp实现文件的上传和下载貌似只能在Linux和Linux之间实现.(欢迎指正不对的地方 ...
最新文章
- cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角
- Max Sum Array 贪心(2500)
- Linux密码是一个回文,usermod命令和用户密码管理
- vs连接oracle数据库报错,用VS连接oracle数据库时ORA-12504错误
- 认识网页 网页的组成 0907
- 实用!使用Mac内置功能一键转换繁体与简体中文
- springboot使用Log4j动态改变日志级别
- 英语演讲和英语课件ppt模板
- RadarNet: Efficient Gesture Recognition Technique Utilizing a Miniaturized Radar Sensor
- Virginie Ruiz
- c语言空气污染指数代码,空气质量指数API是怎么算出来的
- Lonlife 1016 Change of Life
- 虚拟机3-11-14:53,工作记录
- ISCC 2019 逆向rev02
- Java定时任务技术分析
- mean(求均值),max/min(求最值)
- be yet to用法
- 不熟悉的四级核心词汇(三)
- 视觉SLAM十四讲 报错 Could not find a configuration file for package “OpenCV“ that is compatible with reques
- 计算机毕业设计(附源码)python学校健身房管理系统