protobuf是一種高效的資料格式,平臺無關、語言無關、可擴展,可用于 RPC 系統和持續資料存盤系統,
protobuf介紹
Protobuf是Protocol Buffer的簡稱,它是Google公司于2008年開源的一種高效的平臺無關、語言無關、可擴展的資料格式,目前Protobuf作為介面規范的描述語言,可以作為Go語言RPC介面的基礎工具,
protobuf使用
protobuf是一個與語言無關的一個資料協議,所以我們需要先撰寫IDL檔案然后借助專用工具生成指定語言的代碼,從而實作資料的序列化與反序列化程序,
大致開發流程如下: 1. IDL撰寫 2. 生成指定語言的代碼 3. 序列化和反序列化
protobuf語法
protobuf3語法指南
編譯器安裝
ptotoc
protobuf協議編譯器是用c++撰寫的,根據自己的作業系統下載對應版本的protoc編譯器:https://github.com/protocolbuffers/protobuf/releases,解壓后拷貝到GOPATH/bin目錄下,
protoc-gen-go
安裝生成Go語言代碼的工具
go get -u github.com/golang/protobuf/protoc-gen-go
撰寫IDL代碼
在protobuf_demo/address目錄下新建一個名為person.proto的檔案具體內容如下:
// 指定使用protobuf版本
// 此處使用v3版本
syntax = "proto3";
// 包名,通過protoc生成go檔案
package address;
// 性別型別
// 列舉型別第一個欄位必須為0
enum GenderType {
SECRET = 0;
FEMALE = 1;
MALE = 2;
}
// 人
message Person {
int64 id = 1;
string name = 2;
GenderType gender = 3;
string number = 4;
}
// 聯系簿
message ContactBook {
repeated Person persons = 1;
}
生成go語言代碼
在protobuf_demo/address目錄下執行以下命令,
address $ protoc --go_out=. ./person.proto
此時在當前目錄下會生成一個person.pb.go檔案,我們的Go語言代碼里就是使用這個檔案, 在protobuf_demo/main.go檔案中:
package main
import (
"fmt"
"io/ioutil"
"github.com/golang/protobuf/proto"
"github.com/Q1mi/studygo/code_demo/protobuf_demo/address"
)
// protobuf demo
func main() {
var cb address.ContactBook
p1 := address.Person{
Name: "小王子",
Gender: address.GenderType_MALE,
Number: "7878778",
}
fmt.Println(p1)
cb.Persons = append(cb.Persons, &p1)
// 序列化
data, err := proto.Marshal(&p1)
if err != nil {
fmt.Printf("marshal failed,err:%v\n", err)
return
}
ioutil.WriteFile("./proto.dat", data, 0644)
data2, err := ioutil.ReadFile("./proto.dat")
if err != nil {
fmt.Printf("read file failed, err:%v\n", err)
return
}
var p2 address.Person
proto.Unmarshal(data2, &p2)
fmt.Println(p2)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45071.html
標籤:Go
上一篇:gRPC初識
