Protocol Buffer案例详解 Golang
Golang,Protocol,Buffer案例详解,博智网带你了解详细信息 。
Golang Protocol Buffer教程【Protocol Buffer案例详解 Golang】本文介绍如何在Go应用中利用Protocol Buffer数据格式 。主要包括什么是Protocol Buffer数据格式,其超越传统数据格式XML或JSON的优势是什么 。
1. Protocol Buffer数据格式Protocol Buffer,本质就是一种数据格式,和JSON或XML一样,不同的语言用于结构化数据序列化或反序列化 。该数据格式的优势是较xml或json更小,源于Google 。假如我们有一个对象,我们用三种数据结构进行表示:
<person><name>Elliot</name><age>24</age></person>
使用json表示占用空间更小:
{"name": "Elliot","age": 24}
如果使用protocol buffer格式表示:
[10 6 69 108 108 105 111 116 16 24]
如果您仔细观察上面编码可能会看到,从数组位置2开始名字elliot被拼出来,e = 69, l = 108等等 。后面是年龄的字节表示,24岁 。
不过编码格式内容比我们看到的要多,下面会更详细地解释,如果您愿意可看其官方文档 。
现在这个示例数据,Json和 Protocol Buffer格式几乎没有太大差别,但当遇到数据量很大场景时,差别就体现出来了 。
2. 简单示例首先下载必要的依赖:
go get github.com/golang/protobufgo get github.com/golang/protobuf/proto
下载完成后,确保能够在命令行中可以运行 protoc 命令 。下面我们定义 protobuf 结构,这里定义上面用来对比不同数据格式之间差异的person 对象 。
首先指定我们使用的语法格式,这里使用 proto3,然后指定存放的包名 。最后定义对象,Peson类型的消息及其包括的字段 name 和 age 。
person.proto结构定义如下:
syntax="proto3";package main;message Person {string name = 1;int32 age = 2;}
然后在该文件的路径下运行下面命令:
protoc --go_out=. *.proto
即在当前目录下 生成所有扩展名为 proto文件的 .pb.go 文件 。
现在我们定义Person类型对象使用 protobuf格式进行序列化 。代码如下;
import ("fmt""log""github.com/golang/protobuf/proto")func main() {elliot := &Person{Name: "Elliot",Age:24,}data, err := proto.Marshal(elliot)if err != nil {log.Fatal("marshaling error: ", err)}// 打印原始的protobuf序列化对象fmt.Println(data)// 反序列化进行验证newElliot := &Person{}err = proto.Unmarshal(data, newElliot)if err != nil {log.Fatal("unmarshaling error: ", err)}// 打印 `newElliot` 对象进行验证fmt.Println(newElliot.GetAge())fmt.Println(newElliot.GetName())}
使用go run 命令运行,需要在main.go 后面传入 person.pb.go,命令如下:
go run main.go test.pb.go
在ide环境中可以直接运行 。输出结果如下:
[10 6 69 108 108 105 111 116 16 24]name:"Elliot" age:24
3. 嵌套示例我们已经完成了一个非常简单的示例,但现实中消息格式通常会遇到多个嵌套字段,下面增加嵌套类型字段 。
我们仍然使用前面 Person 类型,仅增加社交网络的粉丝字段 。SocialFollowers的消息类型如下:
syntax="proto3";package main;message SocialFollowers {int32 youtube = 1;int32 twitter = 2;}message Person {string name = 1;int32 age = 2;SocialFollowers socialFollowers = 3;}
因为Person 类型已经被修改了,需要重新运行 protoc 命令:
protoc --go_out=. *.proto
现在同时修改代码进行测试,填充 elliot 对象使用 SocialFollowers 类型对象:
package mainimport ("fmt""log""github.com/golang/protobuf/proto")func main() {elliot := Person{Name: "Elliot",Age:24,SocialFollowers: &SocialFollowers{Youtube: 2500,Twitter: 1400,},}// 序列化对象data, err := proto.Marshal(&elliot)if err != nil {log.Fatal("marshaling error: ", err)}// 反序列化对象进行验证newElliot := &Person{}err = proto.Unmarshal(data, newElliot)if err != nil {log.Fatal("unmarshaling error: ", err)}// 输出 `newElliot` 对象属性进行验证fmt.Println(newElliot.GetName())fmt.Println(newElliot.GetAge())fmt.Println(newElliot.SocialFollowers.GetTwitter())fmt.Println(newElliot.SocialFollowers.GetYoutube())}
运行程序输出结果:
Elliot2414002500
4. 总结本文我们学习了Go应用中如何使用 protocol buffer 数据格式 。
到此这篇关于Golang Protocol Buffer案例详解的文章就介绍到这了,更多相关Golang Protocol Buffer内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!
推荐阅读
- Structs框架原理案例详解 Java
- QgraphicsScene类案例详解 C++
- 真实创业故事案例 创业的个人真实经理
- ip是什么意思网络
- 阴兵借道事件真实案例 98年武汉十万阴兵借道
- Oracle区别ADG与DG案例详解
- Oracle中NEXTVAL案例详解
- TinyXML解析案例详解 C++
- CountDownTimer案例总结 Android
- 富士康并购夏普案例分析 夏普为什么被收购
