代码仓库地址

一、介绍

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. 潭州课堂25班:Ph201805201 django 项目 第三十课 linux 系统迁移 (课堂笔记)

    进入虚拟环境, 冷冻 把安装环境放到这个文档中 pip freeze >> requirements.txt 在另一台机器中 pip install -r requirements.txt ...

  2. JS将日期转为距现在的时间长度

    最近在弄一个回忆网站,其中有个一板块类似于情侣空间的纪念日. 照着弄了个类似的,效果如下: 在处理过程中需要把时间戳转为Date()对象,然后与本地时间相减获得时间差,通过运算转换成对应的年月日时长, ...

  3. 开车旅行 [NOIP 2012]

    Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 i ...

  4. json串转化成xml文件、xml文件转换成json串

    1.json串转化成xml文件 p=[{"name":"tom","age":30,"sex":"男" ...

  5. Maven实战(七)——常用Maven插件介绍(上)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...

  6. Jmeter接口测试实例3-登录

    Jmeter实例3:登录 添加http协议—添加IP.路径.方法,察看结果树,运行 登录成功

  7. 深度优先搜素之N皇后问题

    #include<stdio.h>#include<malloc.h>#include<math.h>int x,a[101],book[101],count=0; ...

  8. 【linux】【tomcat】linux下定时重启tomcat

    步骤: 一.创建脚本文件,本脚本文件用于停止,重启tomcat运行的java进程,并设置脚本文件权限 1.新建脚本文件tomcat.sh [注意文件创建的路径] [查看当前路径的命令:   pwd] ...

  9. 给已经存在的项目添加git

    1.打开终端​,cd到已存在项目的目录 ​​​2.输入以下命令行,初始化一个本地仓库: ​git init 3.输入以下命令,把工程所有文件都添加到该仓库中(千万别忘记后面的.号!!!): ​git ...

  10. JS对HTML字符的转义

    function htmlEscape(str){ var s = ""; if(str.length == 0) return ""; s = str.rep ...