gogoprotobuf在windows上遇见的坑

  • 闲话一下
  • 准备工作
  • 创建你的工程目录
  • 生成go文件
  • 我们还想要更简洁的代码
  • 总结

闲话一下

  1. 最近打算做一个联网的小游戏,通讯协议决定使用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上遇见的坑相关推荐

  1. 【吐血经验】在 windows 上安装 spark 遇到的一些坑 | 避坑指南

    在 windows 上安装 spark 遇到的一些坑 | 避坑指南 最近有个活:给了我一个阿里云桌面(windows 10系统),让我在上面用 scala + spark 写一些东西. 总是报错不断, ...

  2. Phalcon在Windows上安装 《Phalcon入坑指南系列 一》

    Phalcon入坑指南 本系列目录 前言 一.安装 二.Phalcon 开发工具安装 三.环境变量配置 四.Phalcon 开发工具的使用 生成项目框架 生成控制器 / 模型 夸一下phalcon 五 ...

  3. windows上Bonjour服务发布的一些坑

    windows上Bonjour服务发布的一些坑 1.遇到的问题 单独发布信息从某个网卡上出去后,会出现自动消失,并且有时会跑到另外一张网卡上 DNSServiceRegister注册服务时回调一直未触 ...

  4. 在 Windows 上测试 Redis Cluster的集群填坑笔记

    redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje 集群环境至少需要3个节点.推荐使用6个节点配置,即3个主节点,3个从节点. 新建6个文件夹 ...

  5. 【Java】Java中的在Linux和Mac以及Windows上使用File.separator的坑

    1.在写代码中使用File.separator,作文文件名的分割时,会报如下的错,这是在windows上运行的,但是Linux和Mac上是可以的 2.原因很简单,直接修改 修改为这样就可以了.

  6. Git学习系列之Windows上安装Git之后的一些配置(图文详解)

    不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...

  7. 如何在 Windows 上安装多个 MySQL,实现 MySQL 跨电脑移植使用

    如何在 Windows 上安装多个 MySQL,实现 MySQL 跨电脑移植使用 初次安装 MySQL 移植使用 附录 其它 MySQL 命令 查看本 MySQL 数据存放目录 MySQL 的各种其它 ...

  8. hadoop2.0以后不需要借助cywin运行在Windows上

    Hadoop 2.0及以后的版本可以直接在windows上跑, 不用cygwin了, 凡是讲cygwin的攻略都可以忽略. 去官网下载hadoop,其实都是tar.gz linux版本,所以我们单独下 ...

  9. sftp方式从windows上传文件到Linux服务器

    今天我一直用scp想实现从windows上传文件到Linux服务器,但是鼓捣了半天也没有实现.后来查资料才发现,scp实现文件的上传和下载貌似只能在Linux和Linux之间实现.(欢迎指正不对的地方 ...

最新文章

  1. cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角
  2. Max Sum Array 贪心(2500)
  3. Linux密码是一个回文,usermod命令和用户密码管理
  4. vs连接oracle数据库报错,用VS连接oracle数据库时ORA-12504错误
  5. 认识网页 网页的组成 0907
  6. 实用!使用Mac内置功能一键转换繁体与简体中文
  7. springboot使用Log4j动态改变日志级别
  8. 英语演讲和英语课件ppt模板
  9. RadarNet: Efficient Gesture Recognition Technique Utilizing a Miniaturized Radar Sensor
  10. Virginie Ruiz
  11. c语言空气污染指数代码,空气质量指数API是怎么算出来的
  12. Lonlife 1016 Change of Life
  13. 虚拟机3-11-14:53,工作记录
  14. ISCC 2019 逆向rev02
  15. Java定时任务技术分析
  16. mean(求均值),max/min(求最值)
  17. be yet to用法
  18. 不熟悉的四级核心词汇(三)
  19. 视觉SLAM十四讲 报错 Could not find a configuration file for package “OpenCV“ that is compatible with reques
  20. 计算机毕业设计(附源码)python学校健身房管理系统

热门文章

  1. PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件”
  2. HTML中pre标签内容溢出
  3. (充电器电池)双电源自动切换电路
  4. Unity Shader总结(八)——光源类型和光照衰减
  5. Scala模式匹配详解
  6. UI设计 banner
  7. mysql 触发器 bug_MySQL触发器不起作用
  8. 数据库怎么保证(分布式)事务一致性
  9. 全云端万能小程序_WeTest+微信:小程序云端测试系统上线
  10. 化工厂理化实验室设计、化工厂实验室装修SICOLAB