<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近專案是採用微服務架構開發的,各服務之間通過gPRC呼叫,基於ProtoBuf序列化協定進行資料通訊,因此接觸學習了Protobuf,本文會對Protobuf的語法做下總結,感興趣的小夥伴們可以參考借鑑,希望對大家能有所幫助。
gRPC的呼叫模型如下:
檔案以.proto做為檔案字尾,除結構定義外的語句以分號結尾。
rpc方法定義結尾的分號可有可無。
Message命名採用駝峰命名方式,欄位命名採用小寫字母加下劃線分隔方式。
首先看一個簡單的範例:
/* 頭部相關宣告 */ syntax = "proto3"; // 語法版本為protobuf3.0 package user; // 定義包名,可以為.proto檔案指定包名,防止訊息名衝突。 import "common.proto"; // 匯入common.proto option go_package = ".;proto"; //服務 service User { rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {} } //定義請求訊息體 message SayHelloRequest { string name = 1; int64 role = 2; } //定義響應訊息體 message SayHelloResponse { string message = 1; }
.proto檔案的第一個非註釋行用於指定語法版本,預設為“proto2”;
可以為.proto
檔案指定包名,防止訊息名衝突。
可以通過import
匯入其它.proto中定義的訊息;常用於匯入一些公共的資訊。
正常情況下只能使用直接匯入的proto檔案的定義;如果需要使用多級import匯入的檔案,import 可以使用 public 屬性。範例如下:
a.proto
import public "common.proto"; // 注意此處使用的是import public import "c.proto";
b.proto
import "a.proto";
在b.proto中可以用common.proto中定義的內容,但是不能用c中的定義的內容。
定義message使用“message”關鍵字,訊息的欄位宣告由4部分構成:欄位修飾符 欄位型別 欄位名稱 = 標誌號。
格式如下:
message 訊息名稱 {
[欄位修飾符] 欄位型別 欄位名稱 = 標誌號;
}
欄位修飾符
我們可以使用repeated關鍵字來表示動態陣列,範例如下:
message User { repeated int64 id = 1; }
在請求的時候我們可以傳[]int64{1, 2, 3, 4}
。
欄位型別
關於欄位型別,這裡列舉幾個常用的,其它的如果有需要可以直接網上搜。
型別 | 備註 |
---|---|
string | 字串 |
double | 64位元浮點型 |
float | 32位元浮點型 |
int32、int64 | 整型 |
bool | 布林型 |
uint32、uint64 | 無符號整型 |
sint32、sint64 | 有符號的整形 |
欄位編號
每個欄位都有一個編號,這些編號是 唯一的。該編號會用來識別二進位制資料中的欄位。編號在1-15範圍內可以用一個位元組編碼表示,在16-2047範圍用兩個位元組表示,所以將15以內得編號留給頻繁出現的欄位可以節省空間。
列舉型別
在定義訊息型別時,我們有可能會為某個欄位預定義值的一個列表,我們可以通過enum來新增一個列舉,為每個可能的值新增一個常數。範例如下:
message UserRequest { string name = 1; // 定義性別列舉 enum Gender { UNKNOWN = 0; MAN = 1; WOMAN = 2; } // 定義一個列舉欄位 Gender gender = 2; }
注意:所有列舉定義都需要包含一個常數對映到0並且作為定義的首行。
巢狀型別
巢狀型別,也就是字面意思,在 message 訊息體中,又巢狀了其它的 message 訊息體,一共有兩種模式,如下:
syntax = "proto3"; message UserResponse { message User { int64 id = 1; string name = 2; } repeated User users = 1; }
如果在外部訊息之外使用內部訊息,則需要使用“outermsg.innermsg”的方式,如,需要在UserResponse外使用User, 則應該使用:
UserResponse.User
Map型別
在返回列表的時候,map型別經常用到,可以使用map關鍵字可以建立一個對映,語法如:
map<key_type, value_type> map_field = N;
範例:
message User { int64 id = 1; string name = 2; } map[int64, User] users = 1;
如果想在RPC中使用已經定義好的訊息型別,可以在.proto檔案中定一個訊息服務介面,使用service關鍵字進行服務定義,如:
service User { rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {} }
到此這篇關於詳解Golang ProtoBuf的基本語法總結的文章就介紹到這了,更多相關Golang ProtoBuf內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45