為什么用?
使用protobuffer可以更簡單更靈活的對結構化的資料進行序列化和反序列化,并且可以在不同的編程語言中進行共享
環境配置
在 Go中使用protobuffer需要首先下載對應的可執行檔案進行編譯,可以到 GitHub 進行下載,對于Go來說,還需要一個插件protoc-gen-go,使用下面的命令進行下載,記得將$GOPATH/bin設定為環境變數
go get github.com/golang/protobuf/protoc-gen-go
訊息格式定義
// 指定語法版本
syntax = "proto3";
// 指定生成的檔案屬于的package
package pb;
// 指定生成的代碼的目錄
option go_package = "protobuf/pb";
// 定義資訊(message)格式
// 型別變數支持string int32 double float bool
// 支持內嵌其他訊息格式
// 使用repeated 可相當于陣列格式,可以至少出現0次
// enum 可以指定資料的取值
message Person {
// 后面的數字用來標識一個域,不能重復
string name = 1;
int32 message = 2;
float price = 3;
enum Type {
// proto3 中,必須從0開始
Bad = 0;
Good = 1;
}
// 使用自定義訊息型別
Pet pet = 4;
// 支持內嵌訊息
message Books {
string name = 1;
int32 pages = 2;
}
// 定義一個可以重復的訊息內容體
repeated Books book = 5;
}
message Pet {
string name = 1;
int32 age = 2;
}
編譯
// 第一個引數--go_out 指定生成的代碼的目錄
// 第二個引數指定需要編譯的檔案
protoc --go_out=. *.proto
序列化和反序列化
首先需要安裝 proto包
go get "google.golang.org/protobuf/proto"
package main
import (
"google.golang.org/protobuf/proto"
// 匯入編譯之后的包
"protobuf-test/protobuf/pb"
"log"
)
func main() {
// 具體的型別名稱可以到包中查看
person := &pb.Person{Name: "Edgar", Message: 2, Book: []*pb.Person_Books{
&pb.Person_Books{
Name: "go programming",
Pages: 600,
},
&pb.Person_Books{
Name: "c programming",
Pages: 900,
},
}}
// 進行序列化,回傳的結果為[]byte型別
// 如果直接輸出序列化的資料,可能和預期不一樣,不過反序列化一定是一樣的
out, err := proto.Marshal(person)
if err != nil {
log.Fatal("marshal error: ", err)
return
}
// 反序列化
var p = &pb.Person{}
if err := proto.Unmarshal(out, p); err != nil {
log.Fatal(err)
}
log.Printf("%v\n", p)
}
更多詳細內容見 官方檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/243355.html
標籤:區塊鏈
