Goでprotobufを使用するための開発者ガイド

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:プロトファイルパス

おすすめ

転載: blog.csdn.net/Xiao_W_u/article/details/115318154