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

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

Mary-Kate Olsen
リリース: 2024-10-29 09:49:02
オリジナル
956 人が閲覧しました

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

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

YAML ファイルの解析は、多くのアプリケーションで一般的なタスクです。ただし、YAML ファイルには、さまざまなタイプの構造体で表す必要があるフィールドが含まれる場合があります。これにより、コードが複雑になり、YAML ファイルが乱雑になる可能性があります。

たとえば、次の YAML ファイルについて考えてみましょう:

<code class="yaml">kind: "foo"
spec:
  fooVal: 4</code>
ログイン後にコピー
<code class="yaml">kind: "bar"
spec:
  barVal: 5</code>
ログイン後にコピー

および解析用の対応する構造体:

<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"spec"`
}

type Foo struct {
    FooVal int `yaml:"fooVal"`
}

type Bar struct {
    BarVal int `yaml:"barVal"`
}</code>
ログイン後にコピー

1 つの方法は、Spec フィールドのタイプとして map[string]interface{} を使用することです。ただし、このアプローチでは、特に大きな YAML ファイルの場合、さらに複雑になりメモリ消費が増加する可能性があります。

より洗練された解決策は、yamlNode 構造体を使用することです:

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

func (n *yamlNode) UnmarshalYAML(unmarshal func(interface{}) error) error {
    n.unmarshal = unmarshal
    return nil
}</code>
ログイン後にコピー

そして Spec 構造体を変更します。使用方法:

<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-" json:"-"`
}</code>
ログイン後にコピー

これらの変更により、Spec の UnmarshalYAML 関数は、Spec フィールドを動的に解析して特定の構造体型にアンマーシャルできるようになります:

<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 フィールドを有限の構造体のセットに動的に解析するエレガントで効率的なソリューション。これにより、コードと YAML ファイルがよりクリーンになり、管理が容易になります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート