代碼倉庫地址html
簡潔git
體積小:消息大小隻須要XML的1/10 ~ 1⁄3github
速度快:解析速度比XML快20 ~ 100倍golang
使用Protobuf的編譯器,能夠生成更容易在編程中使用的數據訪問代碼編程
更好的兼容性,Protobuf設計的一個原則就是要可以很好的支持向下或向上兼容app
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文件ide
> protoc --go_out=. *.proto
注意 包名要和文件夾名一致。工具
package main import ( "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() }
運行結果以下:post
若是有興趣想了解數據的操做,壓縮的全過程,能夠考慮使用Protobuf。
它就像一個代碼轉換器,你只需寫好底層協議,而後用Protobuf現成的工具生成對應語言的源文件,從而達到項目中使用相同協議格式進行數據傳輸的目的。
這是我在工做中學習到的一個新技巧!