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型を使用できます:int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、bool、string。浮動小数点型(float、double)とbytesはmapキーとして使用できません。
サポートされる値型
mapの値には別のmap以外の任意の型を使用できます。つまり、スカラー型、enum、メッセージ型を値として使用できます。
重要な動作
| 側面 | 動作 |
|---|---|
| 順序 | 保証されない — 反復順序は言語や実行ごとに異なる可能性あり |
| 重複キー | 解析時は最後の値が優先。テキストフォーマットでの動作は未定義 |
| デフォルト | 空のmap(エントリなし)がデフォルト。ワイヤー上でシリアライズされない |
| ワイヤーフォーマット | repeated MapEntry { key_type key = 1; value_type value = 2; }と同等 |
Map vs Repeatedメッセージ
キーによる高速ルックアップが必要で順序を気にしない場合はmapを使用します。順序が重要な場合やキーごとに複数の値が必要な場合はrepeatedメッセージを使用します。
ユースケース
設定のキーバリューペア、HTTPヘッダー、ユーザーメタデータ、機能フラグ、ローカライゼーション文字列など、キーから値へのマッピングが自然なデータ構造の格納。