代码仓库地址

一、介绍

Protobuf是Google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的协议格式即同一proto文件被编译成不同的语言版本,加入到各自的工程中去,这样不同语言就可以解析其他语言通过Protobuf序列化的数据。目前官网提供了C++,Python,JAVA,GO等语言的支持。

相对于JSON和XML具有以下优点:

  • 简洁

  • 体积小:消息大小只需要XML的1/10 ~ 1⁄3

  • 速度快:解析速度比XML快20 ~ 100倍

  • 使用Protobuf的编译器,可以生成更容易在编程中使用的数据访问代码

  • 更好的兼容性,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简介和使用

[转]Protobuf3 语法指南_鸟窝

Golang版protobuf的安装与使用

五、小结

如果有兴趣想了解数据的操作,压缩的全过程,可以考虑使用Protobuf。

它就像一个代码转换器,你只需写好底层协议,然后用Protobuf现成的工具生成对应语言的源文件,从而达到项目中使用相同协议格式进行数据传输的目的。

这是我在工作中学习到的一个新技巧!

Golang语言下使用Protocol Buffer教程的更多相关文章

  1. Ggoogle Protocol Buffer的使用 (基于C++语言)

    首先说明的是Protocol Buffle是灵活高效的.它的一个很好的优点(很重要的,我认为)就是后向兼容性--当我们扩展了了.proto文件后,我们照样可以用它来读取之前生成的文件. 之前已经写了关 ...

  2. RabbitMQ官方教程二 Work Queues(GOLANG语言实现)

    RabbitMQ官方教程二 Work Queues(GOLANG语言实现) 在第一个教程中,我们编写了程序来发送和接收来自命名队列的消息. 在这一部分中,我们将创建一个工作队列,该队列将用于在多个wo ...

  3. RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现)

    RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现) 在上一个教程中,我们创建了一个工作队列. 工作队列背后的假设是,每个任务都恰好交付给一个worker处理. 在这 ...

  4. Google Protocol Buffer 的使用

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

  5. 使用hessian+protocol buffer+easyUI综合案例--登陆

    首先先简单介绍下hessian ,protocol buffer, easyUI框架 hessian: Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协 ...

  6. Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?

    前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...

  7. Google Protocol Buffer 的使用(未完待续)

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

  8. 快来看看Google出品的Protocol Buffer,别只会用Json和XML了

    前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...

  9. Google Protocol Buffer安装编译及使用

    近期玩了玩谷歌的Protocol Buffer.以下就简介下 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准.眼下已经正在使用的 ...

随机推荐

  1. php 将时间格式 转为时间戳

    <?php $gte = "2018-08-08"; $year=((int)substr($gte,0,4));//取得年份: $month=((int)substr($g ...

  2. [POJ3614]Sunscreen (贪心)

    题意 (依然来自洛谷) 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉. 而刚开始的阳光的强度非常 ...

  3. 函数(二):input、raw_input、lambda、repr、map、filter、reduce、eval、exec、range、xrange

    一.input()和raw_input(): input()支持用户输入数字或表达式,按类型存或存表达式的计算结果 raw_input():输入所有内容当成字符串存 二.lambda函数:匿名函数 l ...

  4. 100405之python程序安装

    Python的安装 注意安装的path和.exe可执行文件的命名方式 例如py2或者py3 sublime的安装 一.Sublime Text 3安装(64位Windows操作系统): 1.双击 Su ...

  5. C#_02.14_基础五_.NET类

    C#_02.14_基础五_.NET类 一.类实例: 我们前面说过类是一个模板,我们通过类创建一个又一个的实例,通常情况下类当中的变量是每一个实例都各有一份的,互相不影响,而静态字段是除外的,静态字段是 ...

  6. 【最大公约数&链表】权值 @upcexam5921

    时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定一个长为n的正整数序列Ai.对于它的任意一个连续的子序列{Al, Al+1, …, Ar},定义其权值W (l, r)为其长度与序列中所 ...

  7. js生成1-100不重复的随机数及生成10个1-100不重复的随机数

    //生成1-100不重复的随机数 var count=100; var a=new Array(); for(var i=0;i<100;i++){ a[i]=i+1; } a.sort(fun ...

  8. MUI学习02-顶部导航栏

    建议:先看一下MUI注意事项 连接:http://ask.dcloud.net.cn/article/122 固定栏靠前 所谓的固定栏,也就是带有.mui-bar属性的节点,都是基于fixed定位的元 ...

  9. Linux curl命令使用代理、以及代理种类介绍(转)

    Linux curl命令使用代理.以及代理种类介绍   本文转自http://aiezu.com/article/linux_curl_proxy_http_socks.html,感谢作者 有时出于个 ...

  10. Numba加速Python程序

    众所周知,Python和Java一样是基于虚拟机的语言,并不是像C/C++那样将程序代码编译成机器语言再运行,而是解释一行执行一行,速度比较慢.使用Numba库的JIT技术编译以后,可以明显提高程序的 ...