不得不懂系列(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"
複製代碼
相關文章
相關標籤/搜索