Golang語言下使用Protocol Buffer教程

來源:互聯網
上載者:User

代碼倉庫地址

 一、介紹

Protobuf是Google旗下的一款平台無關,語言無關,可擴充的序列化結構資料格式。所以 很適合用做資料存放區和作為不同應用,不同語言之間相互連信的資料交換格式,只要實現相同的協議格式即同一proto檔案被編譯成不同的語言版本,加入到各自的工程中去,這樣不同語言就可以解析其他語言通過Protobuf序列化的資料。目前官網提供了C++,Python,JAVA,GO等語言的支援。

相對於JSON和XML具有以下優點:

  • 簡潔

  • 體積小:訊息大小隻需要XML的1/10 ~ 1⁄3

  • 速度快:解析速度比XML快20 ~ 100倍

  • 使用Protobuf的編譯器,可以產生更容易在編程中使用的資料存取碼

  • 更好的相容性,Protobuf設計的一個原則就是要能夠很好的支援向下或向上相容

 註:本文主要注重protobuf的使用,所以省去了下載、安裝的操作步驟。  

二、建立一個test.proto檔案並產生test.pb.go檔案

syntax = "proto3";  //聲明使用proto3協議package test;  //包名,通過protoc產生go檔案enum PhoneType{    HOME = 0;    WORK = 1;}message Phone{  //訊息定義的關鍵字    PhoneType type = 1;    string number = 2;}message Person{    int32 id = 1;    string name = 2;    repeated Phone phones = 3;  //欄位可以被重複任意多次(包括0次)}message ContactBook{    repeated Person persons = 1;}

 

運行如下命令產生test.pb.go檔案

> protoc --go_out=. *.proto

 

注意 包名要和檔案夾名一致。

 

三、在Go語言中使用Protobuf

package mainimport (    "fmt"    "io/ioutil"    "os"    "pftest/pf"    "pftest/github.com/golang/protobuf/proto")func write() {    p1 := &pf.Person{        Id:   1,        Name: "小張",        Phones: []*pf.Phone{            {pf.PhoneType_HOME, "11111111"},            {pf.PhoneType_WORK, "22222222"},        },    }    p2 := &pf.Person{        Id:   2,        Name: "小王",        Phones: []*pf.Phone{            {pf.PhoneType_HOME, "33333333"},            {pf.PhoneType_WORK, "44444444"},        },    }    p3 := &pf.Person{        Id:   3,        Name: "小李",        Phones: []*pf.Phone{            {pf.PhoneType_HOME,"55555555"},            {pf.PhoneType_WORK,"66666666"},        },    }    book := &pf.ContactBook{}    book.Persons = append(book.Persons, p1)    book.Persons = append(book.Persons, p2)    book.Persons = append(book.Persons, p3)    data, _ := proto.Marshal(book)    ioutil.WriteFile("./test.txt", data, os.ModePerm)}func read() {    date, _ := ioutil.ReadFile("./test.txt")    book := &pf.ContactBook{}    proto.Unmarshal(date, book)    for _, v := range book.Persons {        fmt.Println(v.Id, v.Name)        for _, vv := range v.Phones {            fmt.Println(vv.Type, vv.Number)        }    }}func main() {    write()    read()}

 

運行結果如下:

 

四、參考資料

Google proto2 guideGoogle proto3 guide

golang 使用 protobuf 的教程

Protobuf簡介和使用

[轉]Protobuf3 文法指南_鳥窩

Golang版protobuf的安裝與使用

 

五、小結

如果有興趣想瞭解資料的操作,壓縮的全過程,可以考慮使用Protobuf。

它就像一個代碼轉換器,你只需寫好底層協議,然後用Protobuf現成的工具產生對應語言的源檔案,從而達到項目中使用相同協議格式進行資料轉送的目的。

這是我在工作中學習到的一個新技巧!

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.