go语言使用protobuf
网上为什么充斥着大量几乎一模一样而且不正确的教程???
妈的打开一个关于golang和protobuf的教程,无非都是protobuf多么多么牛逼,xml多么多么傻逼,然后就是怎么安装protobuf,然后又是屎一样的示例。
关键是安装过程还不对。。我先写一下ubuntu的安装步骤,同时适用于mac和其他linux,而且保证是对的。
一、首先去 https://github.com/google/protobuf 下载protobuf,按照readme的步骤来编译安装。如果执行autogen.sh的过程中出现autoreconf not found的错误,说明没有安装automake,在ubuntu执行sudo apt-get install automake libtool就可以了,其他平台根据实际情况安装。
二、执行 go get -u github.com/golang/protobuf/{proto, proto-gen-go} ,自动安装proto-gen-go
三、把proto-gen-go复制到/usr/local/bin 或者其他路径,只要在包含在PATH环境变量中就可以,为了方便protoc调用它。
四、写一个xx.proto文件,执行protoc --go_out=. xx.proto生成go语言的代码,如果提示libprotoc.so找不到,需要把 /usr/local/lib 添加到LD_LIBRARY_PATH环境变量中。
按照这个步骤搞下来,应该都能编译成功了,使用也很简单,网上有大量的屎示例,主要是调用Marshal和Unmarshal来编码和解码。
那么问题来了:
1、我用二进制传输消息意义在哪?
当然就是字节少,传输成本小。
2、二进制不可读啊,怎么解码呢?
调用Unmarshal函数,把对应类型的对象传入,会自动把二进制解码到传入的对象。
3、拿到一大坨二进制数据,怎么知道能解码到哪个类呢?
我仍然认为数据头加上类型ID是比较好的做法。官方C++版本中可以通过协议名称得到一个协议类型,优势是不需要我们自己维护一份switch case的代码。但是类型名称一般不如ID字节少。在网游使用可以把ID多级分类,例如按照背包、好友、帮派分类,背包中再分为装备和物品,然后依次细分,这样每次增删协议对其他部分影响较少。
go语言使用protobuf的更多相关文章
- go语言学习--protobuf的学习
最近在学习中遇到了protobuf,哇喔竟然不知道,马上进行了学习,protobuf也是数据解析的方式,平时使用最多的是json和xml,那么好了,对比下他们的区别,并且附上protobuf的使用. ...
- 使用protobuf (proto3, C++和go语言)
在这里,我先讲述C++使用protobuf,之后,会补充使用go语言使用protobuf. 使用protobuf需要有如下步骤: 在.proto文件中定义消息(message)格式. 使用protob ...
- Netty(五)序列化protobuf在netty中的使用
protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的.它主要优点如下: 1.性能好,效率高: 2.跨语言(java自带的序列化,不能跨语言) protobuf参考文档 ...
- Golang语言下使用Protocol Buffer教程
代码仓库地址 一.介绍 Protobuf是Google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式.所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的 ...
- Go语言_RPC_Go语言的RPC
一 标准库的RPC RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议.简单的说就是要像调用本地函数 ...
- 使用protobuf传递网络消息
1.获取protobuf及相关依赖 新建install_protobuf.bat脚本,粘贴以下代码 ::参考文章 https://github.com/google/protobuf/blob/mas ...
- ProtoBuf开发者指南
目录 1 概览 1.1 什么是protocol buffer 1.2 他们如何工作 1.3 为什么不用XML? 1.4 听起来像是为我的解决方案,如何开始? 1.5 一点历史 ...
- Go Protobuf(比xml小3-10倍, 快20-100倍)
简介 Protocol Buffers是什么? protocol buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小.更快.更为简单.你可以定义数据 ...
- Java序列化的几种方式以及序列化的作用
Java序列化的几种方式以及序列化的作用 本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用 有的时候我们想要把一个Java对象 ...
随机推荐
- POJ 3253 Fence Repair (贪心)
Fence Repair Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- 关于cmd模式下切换目录
cmd下切换目录: 经常犯下的错误一: 在默认路径下输入 cd D: 想切换到D盘但是会出现上面的现象. 正确的的做法是直接输入要转移到的盘符: D: 就可以了. 在这种情况下再输入cd D:
- 24小时学通Linux内核之有关Linux文件系统实现的问题
有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问题,虽然Win10发布了,,但我还是好喜欢XP呀,好想回家用用家里的XP来 ...
- PS基础学习 1---基本工具
1,选框工具: 选择以后对选框中的内容进行修改 ① Shift + 选框 为正方形 ② 选中后鼠标放在选框中对选择范围进行拖动 ③ 移动工具可以拉着选框中的内容移动 ④ ctrl+D取消选框 ⑤单行选 ...
- Linux 命令 - echo: 显示一行文本
命令格式 echo [OPTION]... [STRING]... 命令参数 -n 不输出行尾的换行符. -e 允许对转义字符进行解释. -E 禁止对转义字符进行解释,这是默认的选项. --help ...
- Git CMD - add: Add file contents to the index
命令格式 git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [- ...
- 【转载】Apache Kafka监控之Kafka Web Console
http://www.iteblog.com/archives/1084 Kafka Web Console是一款开源的系统,源码的地址在https://github.com/claudemamo/k ...
- 【MINA】缓存区ByteBuffer和IOBuffer你要了解的常用知识
mina中IOBuffer是Nio中ByteBuffer的衍生类,主要是解决Bytebuffer的两个不足 1.没有提供足够灵活的get/putXXX方法 2.它容量固定,难以写入可变长度的数据 特点 ...
- Entity Framework + WCF REST JSON Service
利用EF 和WCF 建立一个REST JSON Service. 首先我们要下载一个Visual Studio 的Template 叫 "ADO.NET C# POCO Entity Gen ...
- .net转java了
公司技术部门 要求.net全体转向java 本来要看看.net core的 看来是没必要了 现在国内互联网公司.net是越来越少 不知道为何会这样 不过java的生态圈 确实是很强大 也很丰富 ...