”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Go 中将 YAML 字段动态解析为有限结构集?

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

发布于2024-11-08
浏览:796

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,可以使用以下方法:

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:"-"
}
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)
}

使用 YAML v3 进行动态解组

对于 Yaml v3,方法略有不同:

type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"
}
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)
}

结论

这些动态解组技术允许将 YAML 字段灵活解析为有限的结构集,从而提供比建议的解决方法更优雅、更高效的解决方案。请随意探索提供的代码片段并根据您的具体要求优化方法。

最新教程 更多>
  • 为什么使用 Z-Index 时我的伪元素出现在标题元素上方?
    为什么使用 Z-Index 时我的伪元素出现在标题元素上方?
    Z-Index 和伪元素:案例研究在 CSS 中,z-index 属性指定元素的堆叠顺序页面,确定哪些元素出现在其他元素“前面”或“后面”。然而,当涉及到伪元素时,例如 ::before 或 ::after,它们与 z-index 的交互有时可能不那么简单。考虑一个场景,我们使用::before 伪...
    编程 发布于2024-11-08
  • 如何在剥离标签之前删除顽固的 HTML 特殊字符?
    如何在剥离标签之前删除顽固的 HTML 特殊字符?
    去除顽固的 HTML 特殊字符strip_tags 函数虽然擅长删除 HTML 标签,但无法处理讨厌的 HTML 特殊字符,例如用于不间断空格或 © 用于版权符号。这可能是创建干净 RSS 源的绊脚石。要解决此问题,请考虑使用以下策略之一:HTML 实体解码:在字符串经过 strip_tags 之前...
    编程 发布于2024-11-08
  • 如何在 Go 中解密 AES ECB 模式加密?
    如何在 Go 中解密 AES ECB 模式加密?
    Go 中的 AES ECB 加密AES ECB 模式加密,其中每个明文块都独立加密,是一种简单但可能不安全的加密方法。在Go中,可以使用以下代码执行AES ECB解密:package main import ( "crypto/aes" "fmt&quo...
    编程 发布于2024-11-08
  • PHP 会话管理中的 session_unset() 和 session_destroy() 有什么区别?
    PHP 会话管理中的 session_unset() 和 session_destroy() 有什么区别?
    揭示 PHP 中 session_unset() 和 session_destroy() 的独特作用在 PHP 会话管理领域,出现了两个关键函数:session_unset() 和 session_destroy()。虽然它们似乎都围绕会话数据操作,但它们的功能和效果却显着不同。1。理解差异根据 P...
    编程 发布于2024-11-08
  • 以下是一些标题选项,请记住问题格式和文章的重点是控制选择框选项宽度:

**选项 1(更多技术性):**
* **如何控制Sele的宽度
    以下是一些标题选项,请记住问题格式和文章的重点是控制选择框选项宽度: **选项 1(更多技术性):** * **如何控制Sele的宽度
    如何控制选择框选项的宽度当选择框中的选项超出框的宽度时,可能会造成混乱以及笨拙的外观。为了解决这个问题,我们可以同时使用 CSS 和 JavaScript 来自定义选项的宽度并截断任何多余的文本。CSS 方法:虽然单独使用 CSS 是不行的足以设置选项的宽度,我们可以利用它来固定选择框本身的宽度。通...
    编程 发布于2024-11-08
  • C++ 异常说明符值得这么麻烦吗?
    C++ 异常说明符值得这么麻烦吗?
    C 中的异常说明符:你应该使用它们吗?C 中的异常说明符允许您指示函数是否可能抛出特定的异常类型。然而,由于担心 Visual Studio .NET 中的编译器执行、程序终止和非标准行为,人们对其实际用途产生了疑问。为什么不使用异常说明符:有限执行:编译器不严格执行异常说明符,从而减少了它们提供的...
    编程 发布于2024-11-08
  • 使用 .EJS 模板配置 Express
    使用 .EJS 模板配置 Express
    通常,我使用经典的入门版。 Expressjs.com const express = require('express') const app = express() const port = 3000 app.set('view engine', 'ejs') app.use(express.u...
    编程 发布于2024-11-08
  • 如何将自定义字体添加到 Tailwind - 对于网络和本地下载的字体
    如何将自定义字体添加到 Tailwind - 对于网络和本地下载的字体
    创建 Web 应用程序时,包含您喜欢的字体就像锦上添花。字体增强文本效果,使网站更具吸引力,并提供更好的用户体验。设计师和开发人员对某些字体又爱又恨,使用默认字体可能会限制他们的创造力。添加自定义字体使开发人员可以自由地将外部字体添加到他们的应用程序中。 先决条件 在本教程中,我强烈...
    编程 发布于2024-11-08
  • JavaScript 中柯里化的详细讨论
    JavaScript 中柯里化的详细讨论
    Currying হলো একটি ফাংশনাল প্রোগ্রামিং কৌশল যেখানে একটি ফাংশন একাধিক আর্গুমেন্ট নেওয়ার পরিবর্তে একটি একক আর্গুমেন্ট গ্রহণ করে এবং একটি নতুন ফাংশন রিটা...
    编程 发布于2024-11-08
  • 了解 Python 装饰器:深入探讨
    了解 Python 装饰器:深入探讨
    Python 装饰器是强大的工具,允许我们修改或增强函数或方法的行为。常见用例包括日志记录、授权等。 然而,当被要求定义一个装饰器时,许多人可能会说, 它是函数的包装器。 虽然这在技术上是正确的,但幕后还发生了更多事情。 剖析一个简单的装饰器 让我们探讨一个简单的例子: def my_decora...
    编程 发布于2024-11-08
  • 课程计划:年级学生 Python 基础知识(初级)
    课程计划:年级学生 Python 基础知识(初级)
    客观的: 在本课程结束时,学生将对 Python 编程有基本的了解,包括变量、基本数据类型、循环和函数。他们将使用 Python 创建简单的程序,运用逻辑思维和解决问题的技能。 持续时间:6 节课 第 1 课:Python 简介和设置 目标:让学生熟...
    编程 发布于2024-11-08
  • 如何在 Java 中正确复制二维数组以保留修改?
    如何在 Java 中正确复制二维数组以保留修改?
    通过复制保留二维数组修改在 Java 中,创建对象副本时,了解引用分配行为至关重要。在给定的场景中,定义了两个名为 current 和 old 的二维数组,以及复制内容的方法。old() 方法将 current 数组分配给 old 。然而,这只是将引用传输到内存中的同一数组。当对 current 进...
    编程 发布于2024-11-08
  • 如何在不依赖扩展名的情况下确定文件类型?
    如何在不依赖扩展名的情况下确定文件类型?
    如何在不依赖扩展名的情况下检测文件类型除了检查文件的扩展名之外,确定文件是 mp3 还是图像格式是很有价值的编程中的任务。这是一个不依赖扩展的全面解决方案:PHP >= 5.3:$mimetype = finfo_fopen(fopen($filename, 'r'), FILEINFO_MIME_...
    编程 发布于2024-11-08
  • 使用 JavaScript 创建令人着迷的粒子动画
    使用 JavaScript 创建令人着迷的粒子动画
    这就是我们要创建的,将鼠标移到粒子上即可查看效果。 在本文中,我将引导您完成使用 JavaScript 和 HTML5 画布创建迷人粒子动画的过程。该项目不仅增强了网页的美观性,而且还是深入研究一些有趣的编码概念的绝佳机会。让我们开始吧! 项目概况 动画的特点是粒子围绕中心点以圆形图...
    编程 发布于2024-11-08
  • 使用 JavaScript 释放大型语言模型的力量:实际应用程序
    使用 JavaScript 释放大型语言模型的力量:实际应用程序
    In recent years, Large Language Models (LLMs) have revolutionized how we interact with technology, enabling machines to understand and generate human-...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3