詳解Golang?ProtoBuf的基本語法總結(jié)
前言
最近項(xiàng)目是采用微服務(wù)架構(gòu)開發(fā)的,各服務(wù)之間通過gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進(jìn)行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會(huì)對(duì)Protobuf的語法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
gRPC的調(diào)用模型如下:
基本規(guī)范
文件以.proto做為文件后綴,除結(jié)構(gòu)定義外的語句以分號(hào)結(jié)尾。
rpc方法定義結(jié)尾的分號(hào)可有可無。
Message命名采用駝峰命名方式,字段命名采用小寫字母加下劃線分隔方式。
基本語法
首先看一個(gè)簡單的示例:
/* 頭部相關(guān)聲明 */ syntax = "proto3"; // 語法版本為protobuf3.0 package user; // 定義包名,可以為.proto文件指定包名,防止消息名沖突。 import "common.proto"; // 導(dǎo)入common.proto option go_package = ".;proto"; //服務(wù) service User { rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {} } //定義請(qǐng)求消息體 message SayHelloRequest { string name = 1; int64 role = 2; } //定義響應(yīng)消息體 message SayHelloResponse { string message = 1; }
.proto文件的第一個(gè)非注釋行用于指定語法版本,默認(rèn)為“proto2”;
package定義包
可以為.proto
文件指定包名,防止消息名沖突。
import 導(dǎo)入包
可以通過import
導(dǎo)入其它.proto中定義的消息;常用于導(dǎo)入一些公共的信息。
正常情況下只能使用直接導(dǎo)入的proto文件的定義;如果需要使用多級(jí)import導(dǎo)入的文件,import 可以使用 public 屬性。示例如下:
a.proto
import public "common.proto"; // 注意此處使用的是import public import "c.proto";
b.proto
import "a.proto";
在b.proto中可以用common.proto中定義的內(nèi)容,但是不能用c中的定義的內(nèi)容。
定義Message
定義message使用“message”關(guān)鍵字,消息的字段聲明由4部分構(gòu)成:字段修飾符 字段類型 字段名稱 = 標(biāo)志號(hào)。
格式如下:
message 消息名稱 {
[字段修飾符] 字段類型 字段名稱 = 標(biāo)志號(hào);
}
字段修飾符
- singular:默認(rèn)值,該字段可以出現(xiàn)0次或者1次(不能超過1次);
- repeated:該字段可以重復(fù)任意多次(包括0次);
我們可以使用repeated關(guān)鍵字來表示動(dòng)態(tài)數(shù)組,示例如下:
message User { repeated int64 id = 1; }
在請(qǐng)求的時(shí)候我們可以傳[]int64{1, 2, 3, 4}
。
字段類型
關(guān)于字段類型,這里列舉幾個(gè)常用的,其它的如果有需要可以直接網(wǎng)上搜。
類型 | 備注 |
---|---|
string | 字符串 |
double | 64位浮點(diǎn)型 |
float | 32位浮點(diǎn)型 |
int32、int64 | 整型 |
bool | 布爾型 |
uint32、uint64 | 無符號(hào)整型 |
sint32、sint64 | 有符號(hào)的整形 |
字段編號(hào)
每個(gè)字段都有一個(gè)編號(hào),這些編號(hào)是 唯一的。該編號(hào)會(huì)用來識(shí)別二進(jìn)制數(shù)據(jù)中的字段。編號(hào)在1-15范圍內(nèi)可以用一個(gè)字節(jié)編碼表示,在16-2047范圍用兩個(gè)字節(jié)表示,所以將15以內(nèi)得編號(hào)留給頻繁出現(xiàn)的字段可以節(jié)省空間。
枚舉類型
在定義消息類型時(shí),我們有可能會(huì)為某個(gè)字段預(yù)定義值的一個(gè)列表,我們可以通過enum來添加一個(gè)枚舉,為每個(gè)可能的值添加一個(gè)常量。示例如下:
message UserRequest { string name = 1; // 定義性別枚舉 enum Gender { UNKNOWN = 0; MAN = 1; WOMAN = 2; } // 定義一個(gè)枚舉字段 Gender gender = 2; }
注意:所有枚舉定義都需要包含一個(gè)常量映射到0并且作為定義的首行。
嵌套類型
嵌套類型,也就是字面意思,在 message 消息體中,又嵌套了其它的 message 消息體,一共有兩種模式,如下:
syntax = "proto3"; message UserResponse { message User { int64 id = 1; string name = 2; } repeated User users = 1; }
如果在外部消息之外使用內(nèi)部消息,則需要使用“outermsg.innermsg”的方式,如,需要在UserResponse外使用User, 則應(yīng)該使用:
UserResponse.User
Map類型
在返回列表的時(shí)候,map類型經(jīng)常用到,可以使用map關(guān)鍵字可以創(chuàng)建一個(gè)映射,語法如:
map<key_type, value_type> map_field = N;
- key_type 只能是整數(shù)或字符串,enum不能作為key_type;
- value_type 是除了映射(map)意外的任意類型;
示例:
message User { int64 id = 1; string name = 2; } map[int64, User] users = 1;
定義Service
如果想在RPC中使用已經(jīng)定義好的消息類型,可以在.proto文件中定一個(gè)消息服務(wù)接口,使用service關(guān)鍵字進(jìn)行服務(wù)定義,如:
service User { rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {} }
到此這篇關(guān)于詳解Golang ProtoBuf的基本語法總結(jié)的文章就介紹到這了,更多相關(guān)Golang ProtoBuf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 實(shí)現(xiàn)tcp server端和client端,并計(jì)算RTT時(shí)間操作
這篇文章主要介紹了golang 實(shí)現(xiàn)tcp server端和client端,并計(jì)算RTT時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12go語言基礎(chǔ) seek光標(biāo)位置os包的使用
這篇文章主要介紹了go語言基礎(chǔ) seek光標(biāo)位置os包的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05Go語言對(duì)JSON數(shù)據(jù)進(jìn)行序列化和反序列化
這篇文章介紹了Go語言對(duì)JSON數(shù)據(jù)進(jìn)行序列化和反序列化的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07go語言執(zhí)行等待直到后臺(tái)goroutine執(zhí)行完成實(shí)例分析
這篇文章主要介紹了go語言執(zhí)行等待直到后臺(tái)goroutine執(zhí)行完成的方法,實(shí)例分析了Go語言中WaitGroup的使用技巧,需要的朋友可以參考下2015-03-03go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼
本文主要介紹了go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Golang在整潔架構(gòu)基礎(chǔ)上實(shí)現(xiàn)事務(wù)操作
這篇文章在 go-kratos 官方的 layout 項(xiàng)目的整潔架構(gòu)基礎(chǔ)上,實(shí)現(xiàn)優(yōu)雅的數(shù)據(jù)庫事務(wù)操作,需要的朋友可以參考下2024-08-08探究gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎?
這篇文章主要為大家介紹了gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎的問題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08