Bagaimana Menghuraikan Medan YAML secara Dinamik ke dalam Set Struktur Terhad dalam Go?

Barbara Streisand
Lepaskan: 2024-10-30 23:11:30
asal
272 orang telah melayarinya

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

Menghuraikan Medan YAML Secara Dinamik kepada Set Struktur Terhad dalam Go

Pengenalan

Menghuraikan YAML ke dalam struct dalam Go boleh menjadi mudah. Walau bagaimanapun, apabila medan YAML boleh mewakili pelbagai kemungkinan struct, tugasan menjadi lebih kompleks. Artikel ini meneroka pendekatan dinamik menggunakan pakej YAML Go.

Dynamic Unmarshaling dengan YAML v2

Untuk Yaml v2, pendekatan berikut boleh digunakan:

<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>
Salin selepas log masuk
<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>
Salin selepas log masuk

Dynamic Unmarshaling dengan YAML v3

Untuk Yaml v3, pendekatannya sedikit berbeza:

<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"
}</code>
Salin selepas log masuk
<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>
Salin selepas log masuk

Kesimpulan

Teknik unmarshaling dinamik ini membolehkan penghuraian yang fleksibel bagi Medan YAML ke dalam set struktur terhingga, memberikan penyelesaian yang lebih elegan dan cekap daripada penyelesaian yang dicadangkan. Sila terokai coretan kod yang disediakan dan optimumkan pendekatan berdasarkan keperluan khusus anda.

Atas ialah kandungan terperinci Bagaimana Menghuraikan Medan YAML secara Dinamik ke dalam Set Struktur Terhad dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan