天天看點

protocol buffers快速入門 - go語言版

protocol buffers(簡稱protobuf)是google搞的,是用來序列化資料的一種資料格式,類似于json、xml等這種。

本文其他概念不講直接講基本用法了。

首先需要定義資料結構,資料結構定義寫在一個擴充名是

.proto

的文本檔案裡面,這個檔案叫做

proto

檔案。

protobuf的資料叫

message

,每一個消息都是一系列名值對,我們把他叫做

fields

,當然還有更複雜的結構,這就不在這裡讨論了。

例如:

syntax = "proto3";  #版本
package tutorial;   #包名

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}
           

package

包名是為了避免不同項目的名字沖突。

上面就是我們定義的資料結構,然後用protobuf的編譯器

protoc

去生成指定語言的資料通路代碼,提供了簡便的方法來操作整個結構的二進制資料。

protobuf目前支援生成的代碼的有

java

python

Objective-C

C++

Dart

Go

Ruby

C#

。具體可以看https://developers.google.com/protocol-buffers/。

這裡以go語言為例,來測試一個試試。

首先需要安裝protobuf的C++編譯器。

可以參考這裡安裝:https://github.com/protocolbuffers/protobuf/blob/master/src/README.md

下面是參考步驟(系統是Debian9 64位系統,目前目錄在使用者的home目錄):

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.8.0/protobuf-cpp-3.8.0.tar.gz

tar -xzf protobuf-cpp-3.8.0.tar.gz

cd protobuf-3.8.0

./configure

make

sudo make install
           

安裝好後

protoc

指令就是可用了。

然後是安裝go語言代碼生成插件了。

參考說明:https://github.com/golang/protobuf

參考步驟:

go path設定:

GOPATH="/home/dev/gopath"

然後還要設定go path的bin目錄到

path

環境變量裡面去,這樣

protoc

才能找到插件,

export PATH="$PATH:$GOPATH/bin"

go get -u github.com/golang/protobuf/protoc-gen-go
           

一條指令就完成了,友善。

然後我們在資料定義同目錄下面執行指令

protoc --go_out=. *.proto

,就生成了對應的go代碼的。

更為完整的指令

protoc -I=/home/dev/grpc --go_out=/home/dev/grpc /home/dev/grpc/person.proto

-I

是源檔案目錄,

--go_out

是輸出go檔案的目标目錄,最後是指定要編譯的檔案。

其它語言也都是類似的方式生成對應語言的代碼。

執行完上面的指令之後,會生成一個

pb.go

的檔案。

生成了go檔案代碼之後,就可以讀寫

message

了。

說再多也不如直接上代碼來的明了。

建立了一個名稱是

protobuf_demo

測試項目,需要把上面生成的代碼複制到項目下面,

main.go

代碼如下:

//@link https://360us.net/
//https://360us.net/article/66.html
//http://www.tjingxuan.com/  淘寶天貓優惠券
package main

import (
    "log"
    "io/ioutil"
    pb "protobuf_demo/tutorial"
    proto "github.com/golang/protobuf/proto"
)

func main(){
	fname := "protobuf"
	person := &pb.Person{
	    Name: "person1号",
	    Id: 10,
	}

	//寫
	out, err := proto.Marshal(person)
	if err != nil {
	    log.Fatalln("Failed to encode address book:", err)
	}
	if err := ioutil.WriteFile(fname, out, 0644); err != nil {
	    log.Fatalln("Failed to write address book:", err)
	}

	//讀
	in, err := ioutil.ReadFile(fname)
	if err != nil {
            log.Fatalln("Error reading file:", err)
	}
	inPerson := &pb.Person{}
	if err := proto.Unmarshal(in, inPerson); err != nil {
             log.Fatalln("Failed to parse address book:", err)
	}
	log.Println(inPerson)
	log.Println(inPerson.Name)
	log.Println(inPerson.Id)
}
           

總體上就是通過

proto

包提供的

Marshal

Unmarshal

方法來編碼和解碼資料,沒有什麼複雜的操作。

protocol buffers

和xm,json這些類似的,都是用來編碼、解碼資料,友善傳輸、存儲來使用的。

本文的目的是希望新手(當然我也是新手)能夠快速的了解和使用

protocol buffers

,更多進階内容可以自行搜尋,或者通路官方說明。

希望本文對你有所幫助。

廣告時間:http://www.tjingxuan.com/

原文連結:https://360us.net/article/66.html