分享
  1. 首页
  2. 文章

Golang语言下使用Protocol Buffer教程

OctoptusLian · · 1684 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

代码仓库地址

一、介绍

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: 1,
 Name: "小张",
 Phones: []*pf.Phone{
 {pf.PhoneType_HOME, "11111111"},
 {pf.PhoneType_WORK, "22222222"},
 },
 }
 p2 := &pf.Person{
 Id: 2,
 Name: "小王",
 Phones: []*pf.Phone{
 {pf.PhoneType_HOME, "33333333"},
 {pf.PhoneType_WORK, "44444444"},
 },
 }
 p3 := &pf.Person{
 Id: 3,
 Name: "小李",
 Phones: []*pf.Phone{
 {pf.PhoneType_HOME,"55555555"},
 {pf.PhoneType_WORK,"66666666"},
 },
 }
 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现成的工具生成对应语言的源文件,从而达到项目中使用相同协议格式进行数据传输的目的。

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


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:OctoptusLian

查看原文:Golang语言下使用Protocol Buffer教程

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1684 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏