golang中protobuf的使用詳解
前言
protobuf是Google公司提出的一種輕便高效的結構化數(shù)據存儲格式,常用于結構化數(shù)據的序列化,具有語言無關、平臺無關、可擴展性特性,常用于通訊協(xié)議、服務端數(shù)據交換場景。
protobuf的核心內容包括:
- 定義消息:消息的結構體,以message標識。
- 定義接口:接口路徑和參數(shù),以service標識。
通過protobuf提供的機制,服務端與服務端之間只需要關注接口方法名(service)和參數(shù)(message)即可通信,而不需關注繁瑣的鏈路協(xié)議和字段解析,極大降低了服務端的設計開發(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)獲取相關庫
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;
}
//學生
message Student{
int32 id = 1;
string name = 2;
repeated Course courses = 3;
}(3)生成文件命令:protoc --go_out=. test.proto
命令執(zhí)行完,會在test.proto同級目錄下生成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"錯誤
在使用protobuf2升到protobuf3時,更新了proto-gen-go,編譯proto文件進報了錯誤
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;
// 長連接Token驗證請求
message GameAuthReq {
string authToken = 1; // Token
string serverId = 2; // 登錄服務器ID
}
...
編譯命令為:
protoc --go_out=. proto/ipc.proto
protoc-gen-go v1.27.1
protoc v3.12.3
原因是protoc-gen-go版本過高,對源proto文件需要添加包名。在proto文件中添加option go_package = "/ipc";就可以解決了。
syntax = "proto3";
package ipc;
option go_package = "/ipc";
// 長連接Token驗證請求
message GameAuthReq {
string authToken = 1; // Token
string serverId = 2; // 登錄服務器ID
}
...
還有一種解決辦法就是把protoc-gen-go版本退回到1.3.2及以下也可以解決。
到此這篇關于golang中protobuf的使用詳解的文章就介紹到這了,更多相關go protobuf內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人實現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實現(xiàn)命令行聊天機器人2023-12-12
golang接口實現(xiàn)調用修改(值接收者指針接收者)場景詳解
這篇文章主要為大家介紹了golang接口實現(xiàn)調用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08

