ホームページ  >  記事  >  バックエンド開発  >  Go で YAML フィールドを構造体の有限セットに動的に解析するにはどうすればよいですか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 23:11:30209ブラウズ

How to Dynamically Parse a YAML Field into a Finite Set of Structs in Go?

Go で YAML フィールドを有限の構造体セットに動的に解析する

はじめに

Go で YAML を構造体に解析するのは簡単です。ただし、YAML フィールドが複数の可能な構造体を表すことができる場合、タスクはより複雑になります。この記事では、Go の YAML パッケージを使用した動的アプローチについて説明します。

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

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