在go語(yǔ)言中安裝與使用protobuf的方法詳解
簡(jiǎn)介
本文主要給大家介紹了關(guān)于go語(yǔ)言安裝使用protobuf的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
protobuf是Google開(kāi)發(fā)出來(lái)的一個(gè)語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)的數(shù)據(jù)序列化工具,在rpc或tcp通信等很多場(chǎng)景都可以使用。通俗來(lái)講,如果客戶端和服務(wù)端使用的是不同的語(yǔ)言,那么在服務(wù)端定義一個(gè)數(shù)據(jù)結(jié)構(gòu),通過(guò)protobuf轉(zhuǎn)化為字節(jié)流,再傳送到客戶端解碼,就可以得到對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)。這就是protobuf神奇的地方。并且,它的通信效率極高,“一條消息數(shù)據(jù),用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二進(jìn)制序列化的10分之一”。
安裝
編譯安裝protobuf的編譯器protoc
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz tar zxvf protobuf-2.6.1.tar.gz cd protobuf-2.6.1./configure make make install
執(zhí)行 protoc -h
查看安裝是否成功
安裝插件 protoc-gen-go,它是一個(gè)go程序,編譯它之后將可執(zhí)行文件執(zhí)行路徑寫(xiě)入環(huán)境變量
go get github.com/golang/protobuf/protoc-gen-go
獲取proto包
go get github.com/golang/protobuf/proto
在go中使用
protobuf的使用方法是將數(shù)據(jù)結(jié)構(gòu)寫(xiě)入到.proto文件中,使用protoc編譯器編譯(間接使用了插件)得到一個(gè)新的go包,里面包含go中可以使用的數(shù)據(jù)結(jié)構(gòu)和一些輔助方法。
編寫(xiě)test.proto文件
package example; enum FOO { X = 17; }; message Test { required string label = 1; optional int32 type = 2 [default=77]; repeated int64 reps = 3; optional group OptionalGroup = 4 { required string RequiredField = 5; } }
編譯:
執(zhí)行 protoc --go_out=. *.proto
生成 test.pb.go 文件
將test.pb.go文件放入example文件夾(對(duì)應(yīng)上面package)中,作為example包
try
package main import ( "log" "github.com/golang/protobuf/proto" "example" ) func main() { test := &example.Test { Label: proto.String("hello"), Type: proto.Int32(17), Reps: []int64{1, 2, 3}, Optionalgroup: &example.Test_OptionalGroup { RequiredField: proto.String("good bye"), }, } data, err := proto.Marshal(test) if err != nil { log.Fatal("marshaling error: ", err) } newTest := &example.Test{} err = proto.Unmarshal(data, newTest) if err != nil { log.Fatal("unmarshaling error: ", err) } // Now test and newTest contain the same data. if test.GetLabel() != newTest.GetLabel() { log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) } //test.GetOptionalgroup().GetRequiredField() //etc }
一些對(duì)應(yīng)關(guān)系
- message Test對(duì)為 struct 結(jié)構(gòu),其屬性字段有了對(duì)應(yīng)的get方法,在go中可以使用
test.GetLabel()
、test.GetType()
獲取test對(duì)象的屬性 - OptionalGroup對(duì)應(yīng)為 struct中的內(nèi)嵌struct
- proto文件中repeated屬性對(duì)于slice結(jié)構(gòu)
test.Reset()
可以使其所有屬性置為0值- 使用Marshal和Unmarshal可以輕松的編碼和解碼
這些只是一些特性,想要仔細(xì)研究可以查看github上的wiki:https://github.com/golang/protobuf
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Go語(yǔ)言中struct的匿名屬性特征實(shí)例分析
這篇文章主要介紹了Go語(yǔ)言中struct的匿名屬性特征,實(shí)例分析了struct的匿名屬性特征,對(duì)于深入學(xué)習(xí)Go語(yǔ)言程序設(shè)計(jì)具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Go使用defer函數(shù)要注意的幾個(gè)點(diǎn)
這篇文章主要介紹了Go使用defer函數(shù)要注意的幾個(gè)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12go語(yǔ)言中http超時(shí)引發(fā)的事故解決
我們使用的是golang標(biāo)準(zhǔn)庫(kù)的http client,對(duì)于一些http請(qǐng)求,我們?cè)谔幚淼臅r(shí)候,會(huì)考慮加上超時(shí)時(shí)間,如果超時(shí)可能會(huì)引起報(bào)錯(cuò),本文就記一次超時(shí)引發(fā)的事故2021-06-06goland 設(shè)置注釋模板的過(guò)程圖文詳解
這篇文章主要介紹了goland 設(shè)置注釋模板的過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-12-12golang架構(gòu)設(shè)計(jì)開(kāi)閉原則手寫(xiě)實(shí)現(xiàn)
這篇文章主要為大家介紹了golang架構(gòu)設(shè)計(jì)開(kāi)閉原則手寫(xiě)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Golang并發(fā)操作中常見(jiàn)的讀寫(xiě)鎖詳析
Golang中的鎖機(jī)制主要包含互斥鎖和讀寫(xiě)鎖互斥鎖互斥鎖是傳統(tǒng)并發(fā)程序?qū)蚕碣Y源進(jìn)行控制訪問(wèn)的主要手段,這篇文章主要給大家介紹了關(guān)于Golang并發(fā)操作中常見(jiàn)的讀寫(xiě)鎖的相關(guān)資料,需要的朋友可以參考下2021-08-08Golang語(yǔ)言如何避免空指針引發(fā)的panic詳解
簡(jiǎn)單地說(shuō)go語(yǔ)言的指針類(lèi)型和C/C++的指針類(lèi)型用法是一樣的,除了出去安全性的考慮,go語(yǔ)言增加了一些限制,這篇文章主要給大家介紹了關(guān)于Golang語(yǔ)言如何避免空指針引發(fā)panic的相關(guān)資料,需要的朋友可以參考下2022-01-01