protobufとは何ですか?
官方给出的定义是:プロトコルバッファは、構造化データをシリアル化するためのGoogleの言語中立、プラットフォーム中立、拡張可能なメカニズムです。XMLを考えてください。ただし、より小さく、より速く、よりシンプルです。データを一度構造化する方法を定義すると、特別に生成されたソースコードを使用して、さまざまなデータストリームとの間で、さまざまな言語を使用して構造化データを簡単に読み書きできます。
翻訳:Googleの言語に依存しない、プラットフォームに依存しない、拡張可能なメカニズムは、XMLなどの構造化データをシリアル化するために使用されますが、より小さく、より速く、よりシンプルです。データの構造を一度定義するだけで、特別に生成されたソースコードを使用して、さまざまなデータストリームとさまざまな言語間で構造化データを簡単に読み書きできます。
利点:
- 複数の言語をサポートします。(Go、C ++、Javaおよびその他の言語)
- シンプルで効率的
詳細については、protobuf公式ウェブサイトを参照してください。
1.protobufをインストールします
githubダウンロードアドレス:https://github.com/golang/protobuf/releases
2.protoc-gen-goをインストールします
非常に簡単です。goモジュールで次のコマンドを実行するだけです。
go get -u github.com/golang/protobuf/protoc-gen-go
3.1。protobufを定義する
接尾辞が.proto
。のファイルを作成する必要があります。
syntax = "proto3";
package test;
option go_package = "./;test";
message Request {
string query = 1;
int32 page = 2;
int32 size = 3;
}
- proto3:はバージョン番号です。定義されていない場合、proto2バージョンがデフォルトで使用さ
syntax = "proto3";
れ、最初の行に配置する必要があります - メッセージ:メッセージ定義。各フィールドには名前、タイプ、および番号があります。注:各フィールドには一意の番号があります。指定された最小フィールド番号は1で、最大フィールド番号は2 ^ 29-1または536870911です。19000〜19999の番号は使用できません。
- package:宣言が配置されているパッケージ
- go_package:宣言されたファイルがGoパッケージの完全なインポートパスに属するパッケージ
3.2。メッセージタイプ
。プロトタイプ | Goの種類 |
---|---|
ダブル | float64 |
浮く | float32 |
int32 | int32 |
int64 | int64 |
uint32 | uint32 |
uint64 | uint64 |
sint32 | int32 |
sint64 | int64 |
fixed32 | uint32 |
fixed64 | uint64 |
sfixed32 | int32 |
sfixed64 | int64 |
ブール | ブール |
ストリング | ストリング |
バイト | []バイト |
3.3。列挙型
最初の要素としてゼロ値を持っている必要があります。
enum Week {
Sunday=0;
Monday=1;
Tuesday=2;
}
3.4。スライスタイプ
メッセージタイプの要素タイプの前に追加repeated
するだけで、コンパイル時にデフォルトでgoスライスタイプに変換されます。
message Request {
repeated string query = 1; // 切片类型
int32 page = 2;
int32 size = 3;
}
3.5。入れ子型
在消息类型内,是可以定义一个消息类型。 `condition`消息属于了`SearchRequest`的内部消息:
message Request {
message Condition {
string username = 1;
string password = 2;
}
int32 page = 2;
int32 size = 3;
}
もちろん、メッセージタイプの外部で定義されたメッセージタイプを使用して、メッセージタイプを再利用することもできます。
message Condition {
string username = 1;
string password = 2;
}
message Request {
Condition condition = 1; // 引入消息类型
int32 page = 2;
int32 size = 3;
}
3.6。マップタイプ
マップタイプを定義するために、protobufは非常に便利な方法も提供します。
map<key_type, value_type> map_field = N; // map的定义
message Request {
map<string, string> query = 1; // 定义一个字符串键和值的map类型
}
知っておく必要があるのは:
- マップタイプは使用できません
repeated
- マップされたフィールドにキーを指定しても値を指定しない場合、フィールドをシリアル化するときの動作は言語によって異なります。C ++、Java、およびPythonでは、型のデフォルト値はシリアル化されますが、他の言語では、シリアル化された値はありません。
4.サービス定義
RPC
マイクロサービス開発として使用する場合は、.proto
ファイルでRPCサービスインターフェイスを定義できます。
service UserService {
rpc Search(Request) returns (Response);
}
- UserService:定義したサービスインターフェースの名前。
- 検索:定義したサービスインターフェイスメソッドの名前。
- リクエスト:サービスメソッドのパラメータ情報。
- 応答:サービス応答結果情報。
コンパイル
.proto
ファイルディレクトリに切り替えて、以下を実行します。
protoc --go_out=. *.proto
- –go_out:Goコードを生成します
DST_DIR
- * .proto:プロトファイルパス