我一直在try 编写一个定制的UnmarshalYAML函数,该函数将YAML解组为 struct ,并保持意外参数,将它们保存到映射到 struct 本身.

我试着写这个(https://go.dev/play/p/azf2hksriQ1),但是,当然,当我试图在UnmarshalYAML中解组 struct 时,我会得到一个无限循环.

有没有人对如何使这个工作有任何建议? 非常感谢!

推荐答案

您可以使用一种简单的包装技术,为原始类型定义一个类型别名(这样yaml.Unmarshaler就不会调用您的UmarshalYAML方法),并创建一个嵌入所有已知和未知参数的 struct .

type Foo struct {
    Param1     string         `yaml:"param1"`
    Param2     []int          `yaml:"param2"`
    // NOTE: we explicitly ignore this parameter so it won't be 
    // eventually unmarshaled 
    Extensions map[string]any `yaml:"-"` 
}

// UnmarshalYAML implements the yaml.UnmarshalYAML interface.
func (f *Foo) UnmarshalYAML(value *yaml.Node) error {
    // Here we are wrapping Foo, so it will be unmarshaled
    // using without calling foo.UnmarshalYAML
    type Wrapped Foo
    // NOTE: for yaml it's required to provide inline
    // option if we would like to embed
    var val struct {
        Wrapped    `yaml:",inline"`
        Extensions map[string]any `yaml:",inline"`
    }
    if err := value.Decode(&val); err != nil {
        return err
    }
    *f = Foo(val.Wrapped)
    f.Extensions = val.Extensions
    return nil
}

Playground Link

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

Pulumi-S3-当策略依赖于访问点时,如何将AccesspintPolicy附加到访问点

切换选项卡时,Goland IDE中的光标自动转移

使用GO从RDPMC获得价值

golang 的持久隐蔽服务

MaybeReadByte对通道的使用如何在Go中提供随机行为?

戈姆:如何将一对一联系起来?

如何使用gopher-lua定义一个Lua函数,该函数有一个预定义的表作为param,Lua脚本可以在其中访问该函数中的表?

Date.Format正在输出非常奇怪的日期

如何在 zap 记录器库中使用自定义时间函数

Docker 执行失败并显示cmd/ENTRYPOINT 中的命令未找到

在反向 GORM 中创建查询有一个关系

在 Raspberry Pi4 上下载 Go Mod

Go 中 SDL Surface 的 OpenGL 纹理

Go Fyne 禁用 HSplit 调整大小?

如何从字符串中删除多个换行符`\n`但只保留一个?

正则表达式处理数字签名的多个条目

go routine 和接收错误或成功的通道

Go generics:我会在哪里使用 any 而不是 interface{}?

如何在 Prometheus 中正确检测区域和环境信息?