ProtobufのMapフィールド

protobufでキーバリューペア用のmapフィールドの定義方法。サポートされるキー型、値型、順序の動作、mapとrepeatedメッセージの使い分けを学びます。

Field Types

詳細な説明

Mapフィールドによるキーバリューデータ

Mapフィールドはprotobufで連想配列(辞書、ハッシュマップ)を定義する組み込みの方法を提供します。キーと値のフィールドを持つrepeatedメッセージのシンタックスシュガーです。

syntax = "proto3";

message UserProfile {
  string user_id = 1;
  string display_name = 2;

  // 文字列から文字列のmap(メタデータ、ヘッダー、ラベル)
  map<string, string> attributes = 3;

  // 文字列からメッセージのmap
  map<string, Permission> permissions = 4;

  // 整数キーのmap
  map<int32, string> error_messages = 5;
}

message Permission {
  bool read = 1;
  bool write = 2;
  bool admin = 3;
}

サポートされるキー型

mapキーには任意の整数型またはstring型を使用できます:int32int64uint32uint64sint32sint64fixed32fixed64sfixed32sfixed64boolstring。浮動小数点型(floatdouble)とbytesはmapキーとして使用できません

サポートされる値型

mapの値には別のmap以外の任意の型を使用できます。つまり、スカラー型、enum、メッセージ型を値として使用できます。

重要な動作

側面 動作
順序 保証されない — 反復順序は言語や実行ごとに異なる可能性あり
重複キー 解析時は最後の値が優先。テキストフォーマットでの動作は未定義
デフォルト 空のmap(エントリなし)がデフォルト。ワイヤー上でシリアライズされない
ワイヤーフォーマット repeated MapEntry { key_type key = 1; value_type value = 2; }と同等

Map vs Repeatedメッセージ

キーによる高速ルックアップが必要で順序を気にしない場合はmapを使用します。順序が重要な場合やキーごとに複数の値が必要な場合はrepeatedメッセージを使用します。

ユースケース

設定のキーバリューペア、HTTPヘッダー、ユーザーメタデータ、機能フラグ、ローカライゼーション文字列など、キーから値へのマッピングが自然なデータ構造の格納。

試してみる — Protobuf Definition Parser

フルツールを開く