博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不得不懂系列(1)-Go语言protobuf快速上手
阅读量:5986 次
发布时间:2019-06-20

本文共 2391 字,大约阅读时间需要 7 分钟。

说明

protocol buffer是谷歌推出的高效率序列化反序列化工具,可以自定义数据结构,然后使用对应语言的代码生成器生成的代码读写这个数据结构。虽然在和前端打交道时还是要配合使用JSON,但是在其他场合可以尝试使用protocol buffer改进性能。

下面总结下在GoLang中使用protocol buffer的方法。

Go环境配置

下载protobuf

git clone https://github.com/protocolbuffers/protobuf.git复制代码

安装(Linux Ubuntu)

(1)安装依赖工具

sudo apt-get install autoconf automake libtool curl make g++ unzip libffi-dev -y复制代码

(2)进入protobuf文件

cd protobuf/复制代码

(3)进行安装检测 并生成自动安装脚本

./autogen.sh./configure复制代码

(4)进行编译C代码和安装

makesudo make install复制代码

(5)刷新linux共享库关系

sudo ldconfig复制代码

(6)测试protobuf编译工具

protoc -h复制代码

如果正常输出 相关指令 没有报任何error,为安装成功。

获取 GoLang的proto包

(1)下载

go get -v -u github.com/golang/protobuf/proto复制代码

(2)进入到文件夹内进行编译

cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go/go build复制代码

(3)拷贝可执行文件

将生成的 protoc-gen-go可执行文件,放在/bin目录下。

sudo cp protoc-gen-go /bin/复制代码

尝试补齐protoc-gen-go 如果可以补齐代表成功,如果执行不报错 代表工具成功。

Go使用protobuf

新建.proto文件

基本格式如下:

syntax = "proto3"; //必须指定protobuf协议版本号package pb; //包名//定义一个protobuf协议message Person {    string name = 1; //数字表示序号,并不是变量值.    int32 age = 2;    repeated string hobby = 3; //对应go中[]string}复制代码

生成Go数据结构

在.proto所在目录执行如下命令,

protoc --go_out=.  *.proto复制代码

在当前目录下会生成对应的.go文件,可以在其中找到go的数据结构,

type Person struct {	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`	Age                  int32    `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`	Hobby                []string `protobuf:"bytes,3,rep,name=hobby,proto3" json:"hobby,omitempty"`	XXX_NoUnkeyedLiteral struct{} `json:"-"`	XXX_unrecognized     []byte   `json:"-"`	XXX_sizecache        int32    `json:"-"`}复制代码

注意,该文件只能生成不能手动修改。

使用protobuf

在main函数中新建Person对象并进行序列化和反序列化,

package mainimport (	"protobufDemo/pb"	"github.com/golang/protobuf/proto"	"fmt")func main() {	//序列化	person := &pb.Person{		Name:"Jack",		Age:18,		Hobby:[]string{
"sing","dance","basketball","rap"}, } binaryData, err := proto.Marshal(person) if err != nil { fmt.Println("proto.Marshal err:",err) } //反序列化 newPerson := &pb.Person{} err = proto.Unmarshal(binaryData,newPerson) if err != nil { fmt.Println("proto.Unmarshal err:",err) } fmt.Println("序列化前的原始数据:",person) fmt.Println("反序列化得到数据:",newPerson)}复制代码

执行后可以看到person和newPerson都喜欢唱、跳、篮球和rap

序列化前的原始数据: name:"Jack" age:18 hobby:"sing" hobby:"dance" hobby:"basketball" hobby:"rap" 反序列化得到数据: name:"Jack" age:18 hobby:"sing" hobby:"dance" hobby:"basketball" hobby:"rap"复制代码

转载地址:http://mpflx.baihongyu.com/

你可能感兴趣的文章
微积分
查看>>
AD中关于网络标号和导入PCB
查看>>
linux高级编程day02 笔记
查看>>
maven笔记(4)
查看>>
javaBean为什么要implements Serializable
查看>>
Maven Dependencies missing jar 解决
查看>>
3.第一个Node.js程序:Hello World!
查看>>
[TJOI2015]弦论
查看>>
springMVC 静态文件 访问
查看>>
2014上海邀请赛 C Dp + 记录路径
查看>>
Revit API找到墙的正面
查看>>
2018-2019-1 20165306 《信息安全系统设计基础》第六周学习总结
查看>>
[02] 2017前端面试100题
查看>>
java内外循环打印阶梯*号
查看>>
.net开发客户端程序时,如何选择framework版本?
查看>>
python之进程
查看>>
[转] nodeJS的post提交简单实现
查看>>
支付宝移动接口服务端生成签名串代码
查看>>
HDU-2767-ProvingEquivalences
查看>>
How kNN algorithm works(kNN算法原理讲解)
查看>>