首页 > 后端开发 > Golang > 正文

如何在 Go 中将 YAML 字段动态解析为有限结构集?

Barbara Streisand
发布: 2024-10-30 23:11:30
原创
273 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板