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

Go 中的 YAML 自定义标签

WBOY
发布: 2024-02-10 10:18:08
转载
1117人浏览过

go 中的 yaml 自定义标签

php小编香蕉为您介绍Go语言中的YAML自定义标签。YAML是一种轻量级的数据序列化格式,而Go语言作为一种强大的编程语言,自然也提供了对YAML的支持。在Go中,我们可以通过自定义标签来定义YAML的数据结构,以便更好地解析和处理YAML数据。通过使用自定义标签,我们可以在Go中轻松地将YAML数据映射到结构体中,实现更灵活、便捷的数据处理。下面将详细介绍Go中的YAML自定义标签的使用方法和注意事项。

问题内容

我在 go 中有这些嵌套结构,并为其属性添加了自定义标签,

type dummyparams struct {
  param1 string `yaml:"param1"`
  param2 string `yaml:"param2"`
}

type dummy struct {
  name string `yaml:"name"`
  type string `yaml:"type"`
  params dummyparams `yaml:"params"`
}
登录后复制

我创建了一些 dummy 实例并将它们添加到切片中,

dummies := make([]dummy, 0)
dummy1 := dummy {
    name: "a"
    type: "type a"
    params: dummyparams {
        param1: "foo"
        param2: "bar"
    }
}
dummies = append(dummies, dummy1)
dummy2 := dummy {
    name: "b"
    type: "type b"
    params: dummyparams {
        param1: "foo"
        param2: "bar"
    }
}
dummies = append(dummies, dummy2)
登录后复制

最后我整理数据并将其写入文件

yamlData, err := yaml.Marshal(&dummies)
// handle error ...
writeErr := os.WriteFile("foo.yaml", yamlData, 0644)
// handle write error ...
登录后复制

但是我得到的 yaml 没有小写标记名称,而是有大写结构名称。 有人知道为什么会发生这种情况以及如何解决它吗?

解决方法

归咎于您正在使用的 yaml 实现。例如,如果您使用 gopkg.in/yaml.v3 ,它就可以工作。在 go playground 上尝试一下。因此,一种解决方案是使用另一种 yaml 实现,例如 gopkg.in/yaml.v3

您在评论中提到您正在使用 https:// /pkg.go.dev/sigs.k8s.io/[电子邮件受保护]。它的包文档说:

科汛网上商城管理系统
科汛网上商城管理系统

一个经过完善设计有着及其强大的会员互动和独特创新的内容管理系统。主要功能模块包括:文章频道、图片频道、下载频道、动漫频道、音乐频道、影视频道、商城频道、供求频道、采集管理 、专题频道等等。系统通用模块:用户管理、博客日志管理、相册管理、音乐盒管理、朋友圈管理、广告管理、公告管理、模板管理、网站信息配置、高级自定义SQL扩展标签,RSS在线订阅功能、网站统计、邮件列表、邮件群发、数据库管理、站内短消

科汛网上商城管理系统 0
查看详情 科汛网上商城管理系统

简而言之,该库首先使用 go-yaml 将 yaml 转换为 json,然后使用 gopkg.in/yaml.v3json.marshal 与结构进行转换。这意味着它有效地重用了 json 结构标签以及自定义 json 方法 json.unmarshalmarshaljson ,这与 go-yaml 不同。

所以 unmarshaljson 第一个编组到 json。如果您想要小写的字段名称,请使用 sigs.k8s.io/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c554d41406c5a1d021f021c">[email protected]</a> 标签而不是 json 标签:

import "sigs.k8s.io/yaml"

type dummyparams struct {
    param1 string `json:"param1"`
    param2 string `json:"param2"`
}

type dummy struct {
    name   string      `json:"name"`
    type   string      `json:"type"`
    params dummyparams `json:"params"`
}
登录后复制

通过此更改,输出包含小写名称(在 go playground 上尝试):

- name: a
  params:
    param1: foo
    param2: bar
  type: type a
- name: b
  params:
    param1: foo
    param2: bar
  type: type b
登录后复制

请注意,必须使用 yaml 标签而不是 json 才能使其工作只是 yaml 包。如果您想让它与这个包和其他yaml实现一起使用,您可以提供两者 sigs.k8s.io/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" 的一个怪癖data-cfemail="047d6569684472352a372a34">[电子邮件受保护]</a>json 标签:

type DummyParams struct {
    Param1 string `json:"param1" yaml:"param1"`
    Param2 string `json:"param2" yaml:"param2"`
}

type Dummy struct {
    Name   string      `json:"name" yaml:"name"`
    Type   string      `json:"type" yaml:"type"`
    Params DummyParams `json:"params" yaml:"params"`
}
登录后复制

以上就是Go 中的 YAML 自定义标签的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号