日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

詳解Golang?ProtoBuf的基本語法總結_Golang

作者:1個俗人 ? 更新時間: 2022-11-26 編程語言

前言

最近項目是采用微服務架構開發的,各服務之間通過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”;

package定義包

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

import 導入包

可以通過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使用“message”關鍵字,消息的字段聲明由4部分構成:字段修飾符 字段類型 字段名稱 = 標志號。

格式如下:

message 消息名稱 {

[字段修飾符] 字段類型 字段名稱 = 標志號;

}

字段修飾符

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

我們可以使用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;
  • key_type 只能是整數或字符串,enum不能作為key_type;
  • value_type 是除了映射(map)意外的任意類型;

示例:

message User {
    int64 id = 1;
    string name = 2;
}

map[int64, User] users = 1;

定義Service

如果想在RPC中使用已經定義好的消息類型,可以在.proto文件中定一個消息服務接口,使用service關鍵字進行服務定義,如:

service User {
rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {}
}

原文鏈接:https://juejin.cn/post/7155399858004688926

欄目分類
最近更新