Golang を使用した YAML での動的キー解析
概要
YAML (YAML ではありません) Markup Language) は、柔軟なデータ表現を可能にする、広く使用されているデータ シリアル化形式です。ただし、Go 言語は静的に型付けされた構造に大きく依存しているため、動的なキー (つまり、変化する可能性のあるキー) を使用した YAML ファイルの解析には課題が生じます。
問題の説明
キーが異なるバージョン (V1、V2、V3 など) を表す YAML ファイルがあります。ユーザーはサポートするバージョンを指定できますが、キーが順序どおりに並んでいなかったり、バージョンをスキップしたりする可能性があります。この YAML ファイルを Go 構造体に解析したいと考えていますが、構造体のフィールドは動的キーと一致する必要があります。
間違ったアプローチ
最初に YAML を解析しようとしました。ファイルを環境構造体に追加し、キーがルート レベルに存在することを期待します。ただし、ルート要素の実際の型は、環境構造体への文字列 (環境名を表す) のマップです。
ソリューション
動的キーを使用して YAML を解析するには、次のようにします。キーを解析して正しい構造体を構築するカスタム UnmarshalYAML メソッドを構造体で使用する必要があります。この場合、Environment 構造体には、マップとしてルートをアンマーシャルし、個々の環境を解析するための UnmarshalYAML メソッドが必要です。
コード サンプル
例は次のとおりです。環境構造体のカスタム UnmarshalYAML メソッド:
<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(¶ms); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Here we expect an error because a boolean cannot be converted to a MajorVersion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
このメソッドは、最初にブール型フィールド SkipHeaderValidation をアンマーシャリングします。次に、残りのデータを、MajorVersion 構造体へのバージョン名のマップにアンマーシャリングしようとします。ただし、アンマーシャリングされたデータは Boolean 構造体と MajorVersion 構造体が混在しているため、yaml.TypeError がスローされます。コードはこのエラーを無視し、アンマーシャル バージョン マップを環境構造体の Versions フィールドに割り当てます。
使用例
カスタム UnmarshalYAML メソッドを使用すると、次のことが可能になります。これで、YAML データが正しくアンマーシャリングされます:
<code class="go">var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e)</code>
これにより、次の出力が生成されます:
map[string]main.Environment{ "development": { SkipHeaderValidation: true, Versions: { "V2": { Current: "2.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: false, SkipMimeTypeValidation: false, }, "V1": { Current: "1.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: true, SkipMimeTypeValidation: true, }, }, }, }
これは、Go 構造体への動的キーを使用した YAML ファイルの解析が成功したことを示しています。
以上がGo で動的キーを使用して YAML を解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。