Go で YAML フィールドを特定の構造体に動的に解析するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-31 03:50:01
オリジナル
691 人が閲覧しました

How Can I Dynamically Parse a YAML Field to Specific Structs in Go?

Go で YAML フィールドを事前定義された構造体に動的に解析する

特定のフィールドが所定の構造体のセットの任意の値で表現できる YAML ファイルの場合、適切なこのアプローチは、YAML パッケージの UnmarshalYAML メソッドを利用することです。これにより、特定の型のカスタム アンマーシャリング ロジックを作成できます。

YAML v2

YAML v2 を使用すると、次のコードは目的の動作を実現します。

<code class="go">type yamlNode struct {
    unmarshal func(interface{}) error
}

func (n *yamlNode) UnmarshalYAML(unmarshal func(interface{}) error) error {
    n.unmarshal = unmarshal
    return nil
}

type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"`
}</code>
ログイン後にコピー
<code class="go">func (s *Spec) UnmarshalYAML(unmarshal func(interface{}) error) error {
    type S Spec
    type T struct {
        S    `yaml:",inline"`
        Spec yamlNode `yaml:"spec"`
    }

    obj := &T{}
    if err := unmarshal(obj); err != nil {
        return err
    }
    *s = Spec(obj.S)

    switch s.Kind {
    case "foo":
        s.Spec = new(Foo)
    case "bar":
        s.Spec = new(Bar)
    default:
        panic("kind unknown")
    }
    return obj.Spec.unmarshal(s.Spec)
}</code>
ログイン後にコピー

YAML v3

YAML v3 の場合は、次のコードを使用します。

<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"`
}</code>
ログイン後にコピー
<code class="go">func (s *Spec) UnmarshalYAML(n *yaml.Node) error {
    type S Spec
    type T struct {
        *S   `yaml:",inline"`
        Spec yaml.Node `yaml:"spec"`
    }

    obj := &T{S: (*S)(s)}
    if err := n.Decode(obj); err != nil {
        return err
    }

    switch s.Kind {
    case "foo":
        s.Spec = new(Foo)
    case "bar":
        s.Spec = new(Bar)
    default:
        panic("kind unknown")
    }
    return obj.Spec.Decode(s.Spec)
}</code>
ログイン後にコピー

このアプローチは、YAML データを事前定義された構造体のセットにアンマーシャリングするシンプルかつエレガントな方法を提供します。追加の解析手順または過剰なメモリ消費。

以上がGo で YAML フィールドを特定の構造体に動的に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!