ホームページ  >  記事  >  バックエンド開発  >  Go で動的キーを使用して YAML を解析するにはどうすればよいですか?

Go で動的キーを使用して YAML を解析するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-04 02:28:29266ブラウズ

How to Parse YAML with Dynamic Keys in Go?

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(&params); 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。