我在Go中使用了这些嵌套 struct ,并为它们的属性添加了定制标记,

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"`
}

我创建了一些虚拟对象的实例,并将它们添加到切片中,

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没有小写标记的名称,而是大写的Struct名称. 有人知道为什么会发生这种情况吗?知道如何修复吗?

推荐答案

将其归咎于您正在使用的YAML实现.例如,如果你使用gopkg.in/yaml.v3,它就可以工作.在Go Playground号公路上试试吧.因此,一种解决方案是使用另一个YAML实现,例如gopkg.in/yaml.v3.

您在 comments 中提到您使用的是https://pkg.go.dev/sigs.k8s.io/yaml@v1.3.0.它的包装文件说:

简而言之,这个库首先使用GO-YAML将YAML转换为JSON,然后使用json.Marshaljson.Unmarshal与 struct 相互转换.这意味着它与Go-YAML不同,它有效地重用了JSON struct 标记以及定制的JSON方法MarshalJSONUnmarshalJSON.

于是,sigs.k8s.io/yaml@v1.3.0名首批编组来到了JSON.如果要使用小写的字段名称,请使用json个标记,而不是yaml个标记:

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

请注意,必须使用json个标签而不是yaml个标签才能使其工作,这只是sigs.k8s.io/yaml@v1.3.0包的一个怪现象.如果您想让它与this包和其他YAML实现一起工作,您可以提供bothjsonyaml标签:

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相关问答推荐

如何预编译Golang标准库?

可以';t从主机连接到ScyllaDB容器

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

该文件位于模块.内,该模块不包含在您的工作区中

Go Build删除信息

按位移计算结果中的差异

如何解决构建Docker Compose时的权限被拒绝问题

通过多阶段构建复制到 Docker 容器中时找不到文件

同一文件上的多个 Arrow CSV 阅读器返回 null

从 eBPF LRU 哈希映射中错误驱逐的元素

在密钥不存在时处理 PATCH 部分更新

我如何使用 TOML fixtures 在使用 Go Buffalo 框架的开发环境中为我的数据库 seeder ?

Golang Oauth2 服务帐户返回空刷新令牌字符串

NaN 是 golang 中的可比类型吗?

在 go 中将运行命令的标准输出发送到其标准输入

跟踪长时间运行的任务的进度 - 正确的方法

go 堆栈跟踪:在某些函数调用参数或返回值之后的问题(?)标记是什么意思?

在 Golang 中获取谷歌云服务帐户的访问令牌?

try 执行`go test ./... -v`时,Golang中有没有办法设置标志

Beego - 我需要context.Context而不是 Beego 上下文