動的なJSONキーをGoのmap型で扱う
動的または未知のキーを持つJSONオブジェクトをGoのmap[string]interface{}およびmap[string]T型に変換します。型アサーションとイテレーションパターンを解説。
Advanced Types
詳細な説明
GoマップによるJSONの動的キーの処理
JSONオブジェクトのキーがコンパイル時に不明な場合、構造体を定義できません。代わりに、Goの map 型を使用します。
JSONの例
{
"metrics": {
"cpu_usage": 72.5,
"memory_usage": 85.3,
"disk_io": 45.1
},
"labels": {
"env": "production",
"region": "us-east-1",
"team": "backend"
}
}
生成されるGo構造体
type AutoGenerated struct {
Metrics map[string]float64 `json:"metrics"`
Labels map[string]string `json:"labels"`
}
値の型が混在する場合
値が均一でない場合は、map[string]interface{}(Go 1.18以降では map[string]any)を使用します:
{
"settings": {
"theme": "dark",
"fontSize": 14,
"autoSave": true
}
}
type Config struct {
Settings map[string]interface{} `json:"settings"`
}
型アサーション
interface{} 値を使用する場合、基底型にアクセスするために型アサーションが必要です:
if theme, ok := config.Settings["theme"].(string); ok {
fmt.Println("Theme:", theme)
}
マップのイテレーション
for key, value := range response.Metrics {
fmt.Printf("%s: %.1f\n", key, value)
}
構造体 vs マップの判断
キーが既知で固定の場合は構造体を使用します。キーが動的、ユーザー定義、またはレスポンス間で異なる場合はマップを使用します。実際には多くのAPIが両方を組み合わせています — 固定フィールドは構造体フィールドとして、動的フィールドはマップとして。
ユースケース
モニタリングダッシュボード、フィーチャーフラグシステム、キーバリューストアは予測不可能なキーを持つJSONを返します。Goマップを使えば、コンパイル時に正確なキー名を知らなくてもこれらを処理できます。