不得不懂系列(1)-Go语言protobuf快速上手

说明

Demo源码前端

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

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

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代码和安装

make
sudo make install
复制代码

(5)刷新linux共享库关系

sudo ldconfig
复制代码

(6)测试protobuf编译工具

protoc -h
复制代码

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

获取 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目录下。golang

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

尝试补齐protoc-gen-go 若是能够补齐表明成功,若是执行不报错 表明工具成功。shell

Go使用protobuf

新建.proto文件

基本格式以下:json

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的数据结构,curl

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 main

import (
	"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"
复制代码
相关文章
相关标签/搜索