Golang语言下使用Protocol Buffer教程
一、介绍
相对于JSON和XML具有以下优点:
简洁
体积小:消息大小只需要XML的1/10 ~ 1⁄3
速度快:解析速度比XML快20 ~ 100倍
使用Protobuf的编译器,可以生成更容易在编程中使用的数据访问代码
更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容
二、创建一个test.proto文件并生成test.pb.go文件
syntax = "proto3"; //声明使用proto3协议
package test; //包名,通过protoc生成go文件
enum PhoneType{
HOME = 0;
WORK = 1;
}
message Phone{ //消息定义的关键字
PhoneType type = 1;
string number = 2;
}
message Person{
int32 id = 1;
string name = 2;
repeated Phone phones = 3; //字段可以被重复任意多次(包括0次)
}
message ContactBook{
repeated Person persons = 1;
}
运行如下命令生成test.pb.go文件
> protoc --go_out=. *.proto

注意 包名要和文件夹名一致。
三、在Go语言中使用Protobuf
package main import (
"fmt"
"io/ioutil"
"os"
"pftest/pf" "pftest/github.com/golang/protobuf/proto"
) func write() {
p1 := &pf.Person{
Id: ,
Name: "小张",
Phones: []*pf.Phone{
{pf.PhoneType_HOME, ""},
{pf.PhoneType_WORK, ""},
},
} p2 := &pf.Person{
Id: ,
Name: "小王",
Phones: []*pf.Phone{
{pf.PhoneType_HOME, ""},
{pf.PhoneType_WORK, ""},
},
} p3 := &pf.Person{
Id: ,
Name: "小李",
Phones: []*pf.Phone{
{pf.PhoneType_HOME,""},
{pf.PhoneType_WORK,""},
},
} book := &pf.ContactBook{}
book.Persons = append(book.Persons, p1)
book.Persons = append(book.Persons, p2)
book.Persons = append(book.Persons, p3) data, _ := proto.Marshal(book) ioutil.WriteFile("./test.txt", data, os.ModePerm)
} func read() {
date, _ := ioutil.ReadFile("./test.txt")
book := &pf.ContactBook{} proto.Unmarshal(date, book)
for _, v := range book.Persons {
fmt.Println(v.Id, v.Name)
for _, vv := range v.Phones {
fmt.Println(vv.Type, vv.Number)
}
}
} func main() {
write()
read()
}
运行结果如下:

四、参考资料
五、小结
如果有兴趣想了解数据的操作,压缩的全过程,可以考虑使用Protobuf。
它就像一个代码转换器,你只需写好底层协议,然后用Protobuf现成的工具生成对应语言的源文件,从而达到项目中使用相同协议格式进行数据传输的目的。
这是我在工作中学习到的一个新技巧!
Golang语言下使用Protocol Buffer教程的更多相关文章
- Ggoogle Protocol Buffer的使用 (基于C++语言)
首先说明的是Protocol Buffle是灵活高效的.它的一个很好的优点(很重要的,我认为)就是后向兼容性--当我们扩展了了.proto文件后,我们照样可以用它来读取之前生成的文件. 之前已经写了关 ...
- RabbitMQ官方教程二 Work Queues(GOLANG语言实现)
RabbitMQ官方教程二 Work Queues(GOLANG语言实现) 在第一个教程中,我们编写了程序来发送和接收来自命名队列的消息. 在这一部分中,我们将创建一个工作队列,该队列将用于在多个wo ...
- RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现)
RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现) 在上一个教程中,我们创建了一个工作队列. 工作队列背后的假设是,每个任务都恰好交付给一个worker处理. 在这 ...
- Google Protocol Buffer 的使用
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
- 使用hessian+protocol buffer+easyUI综合案例--登陆
首先先简单介绍下hessian ,protocol buffer, easyUI框架 hessian: Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协 ...
- Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?
前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...
- Google Protocol Buffer 的使用(未完待续)
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
- 快来看看Google出品的Protocol Buffer,别只会用Json和XML了
前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...
- Google Protocol Buffer安装编译及使用
近期玩了玩谷歌的Protocol Buffer.以下就简介下 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准.眼下已经正在使用的 ...
随机推荐
- 潭州课堂25班:Ph201805201 django 项目 第三十课 linux 系统迁移 (课堂笔记)
进入虚拟环境, 冷冻 把安装环境放到这个文档中 pip freeze >> requirements.txt 在另一台机器中 pip install -r requirements.txt ...
- JS将日期转为距现在的时间长度
最近在弄一个回忆网站,其中有个一板块类似于情侣空间的纪念日. 照着弄了个类似的,效果如下: 在处理过程中需要把时间戳转为Date()对象,然后与本地时间相减获得时间差,通过运算转换成对应的年月日时长, ...
- 开车旅行 [NOIP 2012]
Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 i ...
- json串转化成xml文件、xml文件转换成json串
1.json串转化成xml文件 p=[{"name":"tom","age":30,"sex":"男" ...
- Maven实战(七)——常用Maven插件介绍(上)
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...
- Jmeter接口测试实例3-登录
Jmeter实例3:登录 添加http协议—添加IP.路径.方法,察看结果树,运行 登录成功
- 深度优先搜素之N皇后问题
#include<stdio.h>#include<malloc.h>#include<math.h>int x,a[101],book[101],count=0; ...
- 【linux】【tomcat】linux下定时重启tomcat
步骤: 一.创建脚本文件,本脚本文件用于停止,重启tomcat运行的java进程,并设置脚本文件权限 1.新建脚本文件tomcat.sh [注意文件创建的路径] [查看当前路径的命令: pwd] ...
- 给已经存在的项目添加git
1.打开终端,cd到已存在项目的目录 2.输入以下命令行,初始化一个本地仓库: git init 3.输入以下命令,把工程所有文件都添加到该仓库中(千万别忘记后面的.号!!!): git ...
- JS对HTML字符的转义
function htmlEscape(str){ var s = ""; if(str.length == 0) return ""; s = str.rep ...