最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Golang?ProtoBuf的基本語法總結(jié)

 更新時間:2022年10月18日 09:05:53   作者:1個俗人  
最近項目是采用微服務(wù)架構(gòu)開發(fā)的,各服務(wù)之間通過gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進(jìn)行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會對Protobuf的語法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助

前言

最近項目是采用微服務(wù)架構(gòu)開發(fā)的,各服務(wù)之間通過gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進(jìn)行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會對Protobuf的語法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

gRPC的調(diào)用模型如下:

基本規(guī)范

文件以.proto做為文件后綴,除結(jié)構(gòu)定義外的語句以分號結(jié)尾。

rpc方法定義結(jié)尾的分號可有可無。

Message命名采用駝峰命名方式,字段命名采用小寫字母加下劃線分隔方式。

基本語法

首先看一個簡單的示例:

/*
頭部相關(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) {}
}

//定義請求消息體
message SayHelloRequest {
string name = 1;
int64  role = 2;
}

//定義響應(yīng)消息體
message SayHelloResponse {
string message = 1;
}

.proto文件的第一個非注釋行用于指定語法版本,默認(rèn)為“proto2”;

package定義包

可以為.proto文件指定包名,防止消息名沖突。

import 導(dǎo)入包

可以通過import導(dǎo)入其它.proto中定義的消息;常用于導(dǎo)入一些公共的信息。

正常情況下只能使用直接導(dǎo)入的proto文件的定義;如果需要使用多級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)志號。

格式如下:

message 消息名稱 {

[字段修飾符] 字段類型 字段名稱 = 標(biāo)志號;

}

字段修飾符

  • singular:默認(rèn)值,該字段可以出現(xiàn)0次或者1次(不能超過1次);
  • repeated:該字段可以重復(fù)任意多次(包括0次);

我們可以使用repeated關(guān)鍵字來表示動態(tài)數(shù)組,示例如下:

message User {
	repeated int64 id = 1;
}

在請求的時候我們可以傳[]int64{1, 2, 3, 4}。

字段類型

關(guān)于字段類型,這里列舉幾個常用的,其它的如果有需要可以直接網(wǎng)上搜。

類型備注
string字符串
double64位浮點型
float32位浮點型
int32、int64整型
bool布爾型
uint32、uint64無符號整型
sint32、sint64有符號的整形

字段編號

每個字段都有一個編號,這些編號是 唯一的。該編號會用來識別二進(jìn)制數(shù)據(jù)中的字段。編號在1-15范圍內(nèi)可以用一個字節(jié)編碼表示,在16-2047范圍用兩個字節(jié)表示,所以將15以內(nèi)得編號留給頻繁出現(xiàn)的字段可以節(jié)省空間。

枚舉類型

在定義消息類型時,我們有可能會為某個字段預(yù)定義值的一個列表,我們可以通過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;
} 

如果在外部消息之外使用內(nèi)部消息,則需要使用“outermsg.innermsg”的方式,如,需要在UserResponse外使用User, 則應(yīng)該使用:

UserResponse.User

Map類型

在返回列表的時候,map類型經(jīng)常用到,可以使用map關(guān)鍵字可以創(chuàng)建一個映射,語法如:

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文件中定一個消息服務(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入解析Golang中JSON的編碼與解碼

    深入解析Golang中JSON的編碼與解碼

    隨著互聯(lián)網(wǎng)的快速發(fā)展和數(shù)據(jù)交換的廣泛應(yīng)用,各種數(shù)據(jù)格式的處理成為軟件開發(fā)中的關(guān)鍵問題,本文將介紹?Golang?中?JSON?編碼與解碼的相關(guān)知識,幫助大家了解其基本原理和高效應(yīng)用,需要的可以收藏一下
    2023-05-05
  • go-cqhttp權(quán)限管理系統(tǒng)的實現(xiàn)代碼

    go-cqhttp權(quán)限管理系統(tǒng)的實現(xiàn)代碼

    這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • Swaggo零基礎(chǔ)入門教程

    Swaggo零基礎(chǔ)入門教程

    swagger是一套基于OpenAPI規(guī)范構(gòu)建的開源工具,使用RestApi。swagger-ui呈現(xiàn)出來的是一份可交互式的API文檔,可以直接在文檔頁面嘗試API的調(diào)用
    2023-01-01
  • Go和RabbitMQ構(gòu)建高效的消息隊列系統(tǒng)

    Go和RabbitMQ構(gòu)建高效的消息隊列系統(tǒng)

    本文主要介紹了使用Go語言和RabbitMQ搭建一個簡單的消息隊列系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Golang實現(xiàn)延遲調(diào)用的項目實踐

    Golang實現(xiàn)延遲調(diào)用的項目實踐

    本文主要介紹了Golang實現(xiàn)延遲調(diào)用的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Go1.21新增maps包的用法詳解

    Go1.21新增maps包的用法詳解

    maps?包提供了幾個非常有用的用于操作?map?類型(任何類型的?map)的函數(shù),本文為大家整理了部分函數(shù)的具體用法,感興趣的小伙伴可以了解一下
    2023-08-08
  • Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    這篇文章主要介紹了Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Go channel如何批量讀取數(shù)據(jù)

    Go channel如何批量讀取數(shù)據(jù)

    本文將展示一個從 Go channel 中批量讀取數(shù)據(jù),并批量發(fā)送到 Kafka 和批量寫入網(wǎng)絡(luò)數(shù)據(jù)的示例,文中的示例代碼講解詳細(xì),有需要的可以參考下
    2024-10-10
  • Golang實現(xiàn)簡易的命令行功能

    Golang實現(xiàn)簡易的命令行功能

    這篇文章主要為大家詳細(xì)介紹了如何通過Golang實現(xiàn)一個簡易的命令行功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-02-02
  • Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例

    Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例

    這篇文章主要為大家介紹了Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評論

深水埗区| 南京市| 铜陵市| 都匀市| 绵阳市| 来宾市| 岳西县| 中超| 霍城县| 错那县| 宜章县| 滁州市| 石渠县| 保靖县| 西盟| 桦南县| 肃宁县| 巴林右旗| 平安县| 黄浦区| 盈江县| 南平市| 朝阳市| 康保县| 定边县| 宣威市| 唐河县| 康平县| 青阳县| 江北区| 沈丘县| 马关县| 勐海县| 手机| 桑植县| 苍溪县| 大余县| 寻乌县| 永仁县| 收藏| 安岳县|