gpt4 book ai didi

go - 基于 YAML 字段将 YAML 解码为不同的结构

转载 作者:行者123 更新时间:2023-12-05 02:35:04 24 4
gpt4 key购买 nike

我正在尝试将以下 YAML 数据解码为 Go 结构。

数据格式如下:

fetchers:
- type: "aws"
config:
omega: "lul"
- type: "kubernetes"
config:
foo: "bar"

根据类型字段,我想确定是否将配置字段解码为 awsConfigkubernetesConfig 结构。

我当前的代码如下所示(使用“gopkg.in/yaml.v2”):

type kubernetesConfig struct {
foo string `yaml:"foo"`
}
type awsConfig struct {
omega string `yaml:"omega"`
}

var c struct {
Fetchers []struct {
Type string `yaml:"type"`
Config interface{} `yaml:"config"`
} `yaml:"fetchers"`
}

err := yaml.Unmarshal(data, &c)
if err != nil {
log.Fatal(err)
}
for _, val := range c.Fetchers {
switch val.Type {
case "kubernetes":
conf := val.Config.(kubernetesConfig)
fmt.Println(conf.foo)
case "aws":
conf := val.Config.(awsConfig)
fmt.Println(conf.omega)
default:
log.Fatalf("No matching type, was type %v", val.Type)
}
}

Playground 上的代码:https://go.dev/play/p/klxOoHMCtnG

目前,它被解码为 ma​​p[interface {}]interface {},无法转换为上述结构之一。
错误: panic :接口(interface)转换:interface {} 是 map[interface {}]interface {},不是 main.awsConfig\

我是否必须使用自定义 UnmarshalYAML 函数实现 YAML 包的 Unmarshaler 接口(interface)才能完成此操作?

最佳答案

通过实现 Unmarshaler 接口(interface)找到了解决方案:

type Fetcher struct {
Type string `yaml:"type"`
Config interface{} `yaml:"config"`
}

// Interface compliance
var _ yaml.Unmarshaler = &Fetcher{}

func (f *Fetcher) UnmarshalYAML(unmarshal func(interface{}) error) error {
var t struct {
Type string `yaml:"type"`
}
err := unmarshal(&t)
if err != nil {
return err
}
f.Type = t.Type
switch t.Type {
case "kubernetes":
var c struct {
Config kubernetesConfig `yaml:"config"`
}
err := unmarshal(&c)
if err != nil {
return err
}
f.Config = c.Config
case "aws":
var c struct {
Config awsConfig `yaml:"config"`
}
err := unmarshal(&c)
if err != nil {
return err
}
f.Config = c.Config
}
return nil
}

关于go - 基于 YAML 字段将 YAML 解码为不同的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70635636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com