golang中protobuf的使用詳解
前言
protobuf是Google公司提出的一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,常用于結(jié)構(gòu)化數(shù)據(jù)的序列化,具有語言無關(guān)、平臺(tái)無關(guān)、可擴(kuò)展性特性,常用于通訊協(xié)議、服務(wù)端數(shù)據(jù)交換場(chǎng)景。
protobuf的核心內(nèi)容包括:
- 定義消息:消息的結(jié)構(gòu)體,以message標(biāo)識(shí)。
- 定義接口:接口路徑和參數(shù),以service標(biāo)識(shí)。
通過protobuf提供的機(jī)制,服務(wù)端與服務(wù)端之間只需要關(guān)注接口方法名(service)和參數(shù)(message)即可通信,而不需關(guān)注繁瑣的鏈路協(xié)議和字段解析,極大降低了服務(wù)端的設(shè)計(jì)開發(fā)成本。
1、protobuf配置
(1)https://github.com/protocolbuffers/protobuf/releases
(2)選擇適合的版本:protoc-3.8.0-win64.zip
(3)解壓后將文件 protoc.exe 所在目錄添加到環(huán)境變量 Path
(4)檢查protobuf版本,CMD命令窗口執(zhí)行:protoc --version
2、proto文件處理
(1)獲取相關(guān)庫
go get -u github.com/golang/protobuf/protoc-gen-go
(2)編寫test.proto文件
//指定版本 syntax = "proto3"; //包名 package pb; //課程 message Course{ int32 id = 1; string name = 2; } //學(xué)生 message Student{ int32 id = 1; string name = 2; repeated Course courses = 3; }
(3)生成文件命令:protoc --go_out=. test.proto
命令執(zhí)行完,會(huì)在test.proto同級(jí)目錄下生成test.pb.go文件
3、使用
package main import ( "fmt" "log" "test/protobuf/pb" "github.com/golang/protobuf/proto" ) func main() { course1 := pb.Course{ Id: *proto.Int32(1), Name: *proto.String("Golang"), } course2 := pb.Course{ Id: *proto.Int32(2), Name: *proto.String("Python3"), } stu := pb.Student{ Id: *proto.Int32(1), Name: *proto.String("篤志弘毅"), Courses: []*pb.Course{&course1, &course2}, } //序列化 data, err := proto.Marshal(&stu) if err != nil { log.Fatalln("proto.Marshal err:", err) } fmt.Println(data) //反序列化 var stuNew pb.Student err = proto.Unmarshal(data, &stuNew) if err != nil { log.Fatalln("proto.Unmarshal err:", err) } fmt.Println(stuNew) }
問題解決:編譯go版本proto3出現(xiàn)"go_package"錯(cuò)誤
在使用protobuf2升到protobuf3時(shí),更新了proto-gen-go,編譯proto文件進(jìn)報(bào)了錯(cuò)誤
protoc-gen-go: unable to determine Go import path for "proto/ipc.proto"
Please specify either:
• a "go_package" option in the .proto source file, or
• a "M" argument on the command line.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
--go_out: protoc-gen-go: Plugin failed with status code 1.
源文件為:
syntax = "proto3"; package ipc; // 長(zhǎng)連接Token驗(yàn)證請(qǐng)求 message GameAuthReq { string authToken = 1; // Token string serverId = 2; // 登錄服務(wù)器ID } ...
編譯命令為:
protoc --go_out=. proto/ipc.proto
protoc-gen-go v1.27.1
protoc v3.12.3
原因是protoc-gen-go版本過高,對(duì)源proto文件需要添加包名。在proto文件中添加option go_package = "/ipc";就可以解決了。
syntax = "proto3"; package ipc; option go_package = "/ipc"; // 長(zhǎng)連接Token驗(yàn)證請(qǐng)求 message GameAuthReq { string authToken = 1; // Token string serverId = 2; // 登錄服務(wù)器ID } ...
還有一種解決辦法就是把protoc-gen-go版本退回到1.3.2及以下也可以解決。
到此這篇關(guān)于golang中protobuf的使用詳解的文章就介紹到這了,更多相關(guān)go protobuf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang time包做時(shí)間轉(zhuǎn)換操作
這篇文章主要介紹了golang time包做時(shí)間轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人實(shí)現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實(shí)現(xiàn)命令行聊天機(jī)器人2023-12-12golang接口實(shí)現(xiàn)調(diào)用修改(值接收者指針接收者)場(chǎng)景詳解
這篇文章主要為大家介紹了golang接口實(shí)現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Go語言實(shí)現(xiàn)定時(shí)器的原理及使用詳解
這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)定時(shí)器的兩種方法:一次性定時(shí)器(Timer)和周期性定時(shí)器(Ticker),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12Go語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單生產(chǎn)者消費(fèi)者模型
本文主要介紹了Go語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單生產(chǎn)者消費(fèi)者模型,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12