简介
本文主要给大家介绍了关于go语言安装使用protobuf的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
protobuf是Google开发出来的一个语言无关、平台无关的数据序列化工具,在rpc或tcp通信等很多场景都可以使用。通俗来讲,如果客户端和服务端使用的是不同的语言,那么在服务端定义一个数据结构,通过protobuf转化为字节流,再传送到客户端解码,就可以得到对应的数据结构。这就是protobuf神奇的地方。并且,它的通信效率极高,“一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一”。
安装
编译安装protobuf的编译器protoc
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz tar zxvf protobuf-2.6.1.tar.gz cd protobuf-2.6.1./configure make make install
执行 protoc -h
查看安装是否成功
安装插件 protoc-gen-go,它是一个go程序,编译它之后将可执行文件执行路径写入环境变量
go get github.com/golang/protobuf/protoc-gen-go
获取proto包
go get github.com/golang/protobuf/proto
在go中使用
protobuf的使用方法是将数据结构写入到.proto文件中,使用protoc编译器编译(间接使用了插件)得到一个新的go包,里面包含go中可以使用的数据结构和一些辅助方法。
编写test.proto文件
package example; enum FOO { X = 17; }; message Test { required string label = 1; optional int32 type = 2 [default=77]; repeated int64 reps = 3; optional group OptionalGroup = 4 { required string RequiredField = 5; } }
编译:
执行 protoc --go_out=. *.proto
生成 test.pb.go 文件
将test.pb.go文件放入example文件夹(对应上面package)中,作为example包
try
package main import ( "log" "github.com/golang/protobuf/proto" "example" ) func main() { test := &example.Test { Label: proto.String("hello"), Type: proto.Int32(17), Reps: []int64{1, 2, 3}, Optionalgroup: &example.Test_OptionalGroup { RequiredField: proto.String("good bye"), }, } data, err := proto.Marshal(test) if err != nil { log.Fatal("marshaling error: ", err) } newTest := &example.Test{} err = proto.Unmarshal(data, newTest) if err != nil { log.Fatal("unmarshaling error: ", err) } // Now test and newTest contain the same data. if test.GetLabel() != newTest.GetLabel() { log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) } //test.GetOptionalgroup().GetRequiredField() //etc }
一些对应关系
- message Test对为 struct 结构,其属性字段有了对应的get方法,在go中可以使用
test.GetLabel()
、test.GetType()
获取test对象的属性 - OptionalGroup对应为 struct中的内嵌struct
- proto文件中repeated属性对于slice结构
test.Reset()
可以使其所有属性置为0值- 使用Marshal和Unmarshal可以轻松的编码和解码
这些只是一些特性,想要仔细研究可以查看github上的wiki:https://github.com/golang/protobuf
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
更新日志
- 草蜢.1998-快慢精选30首2CD【宝丽金】【WAV+CUE】
- 韩红/陈萨《沉默的光影》[FLAC/分轨][105.37MB]
- 群星《华纳至尊金曲》2CD[FLAC][865M]
- 周杰伦《JAY》[WAV分轨][624M]
- dnf110装备搭配
- 崩坏星穹铁道2.2美梦往事活动攻略大全 钟表小子美梦往事全流程选择
- 崩坏星穹铁道2.2新增钟表把戏任务怎么过 崩铁2.2梦境迷钟解密方法
- 刘思涵.2013-拥抱你【种子音乐】【WAV+CUE】
- 刘容嘉.2014-我的自卑感【亚神音乐】【WAV+CUE】
- 【HIRES】贝多芬《钢琴奏鸣曲No.814“月光与悲怆”》索尼精迅Hi-Res/FLAC/96kHz/24bit」
- Switch继任机或采用12GB内存 存储空间256GB
- 任天堂NS2大概率不在本财年内发售 芯片供应有保障
- 万代魂推出1:1《塞尔达传说》大师之剑 9月正式发售
- 江梦蕾.1997-爱的旋律·成名经典(巨星珍藏系列)【丽风】【WAV+CUE】
- 陈明韶.1978-伞下的世界(滚石新格民歌系列15)【滚石】【WAV+CUE】