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 公司内部的混合语言数据标准.眼下已经正在使用的 ...
随机推荐
- BZOJ5100 : [POI2018]Plan metra
若$1$到$n$之间没有其它点,则$1$到$n$的距离为任意一点到它们距离的差值,按照距离关系判断每个点是挂在$1$上还是挂在$n$上即可. 否则$1$到$n$的距离只可能为任意一点到它们距离和的最小 ...
- Jmeter接口测试实例3-登录
Jmeter实例3:登录 添加http协议—添加IP.路径.方法,察看结果树,运行 登录成功
- jmeter接口测试实例1-添加学生信息
jmeter实例1:添加学生信息 进入jmeter,添加线程组改名称为添加学生信息(为了好区分接口),添加http请求,输入IP,方法,路径,在body data中输入json串,同上面postman ...
- Alpha冲刺——序言篇(任务与计划)
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺--序言篇 团队名称 待就业六人组 一.代码规范 详见项目在线文档:项目代码规范 二.本次冲刺任务与计划 任务 内容 时间 第一天 ...
- elasticsearch服务安装采坑
笔者这里下载的elastic search,是5.3.0版本,下载地址:https://www.elastic.co/downloads/past-releases/elasticsearch-5-3 ...
- CSS_选择符
2016-10-28 <CSS入门经典>第五章 以下提示注意事项: 1.如何选择使用id选择符还是class选择符:当确信id选择符在页面的唯一性时,就可以使用id选择符. 2.通用选择符 ...
- kettle 6.1 按时间增量抽取数据
1.设计一个增量 配置表ETL_INCREMENTAL,用于配置表的增量时间等数据 2.增量JOB全图如下: 2.1获取增量时间变量,并设置增量变量 2.2 表的增量转换,在表中引用2.1的增量变量 ...
- HashSet代码分析
HashSet (jdk 1.7)的继承关系如下: HashSet是使用HashMap实现的一个没有重复元素的集合.HashSet用法如下: HashSet<String> hashSet ...
- JAVA使用Logback发送日志到控制台、文件、ELK的最简单用法
一.简述 本文讲JAVA使用Logback发送日志到控制台.文件.ELK的最简单用法. 二.教程 1.新建pom.xml项目引入下列依赖: <dependencies> <!--Be ...
- C# 多线程參数传递
1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo { public class Funct ...