我有一个文件,其中一个字段可以由一种可能的结构表示。为了简化代码和 yaml 文件,假设我有这些 yaml 文件:yaml
kind: "foo"
spec:
fooVal: 4
kind: "bar"
spec:
barVal: 5
以及这些用于解析的结构:
type Spec struct {
Kind string `yaml:"kind"`
Spec interface{} `yaml:"spec"`
}
type Foo struct {
FooVal int `yaml:"fooVal"`
}
type Bar struct {
BarVal int `yaml:"barVal"`
}
我知道我可以用作一种字段类型。但是实际的例子更复杂,并且涉及更多可能的结构类型,而不仅仅是和,这就是为什么我不喜欢解析到该领域。map[string]interface{}SpecFooBarspec
我找到了一个解决方法:将yaml解构到中间结构中,然后检查字段,将字段封送到yaml后面,然后将其取消到具体类型:kindmap[string]interface{}
var spec Spec
if err := yaml.Unmarshal([]byte(src), &spec); err != nil {
panic(err)
}
tmp, _ := yaml.Marshal(spec.Spec)
if spec.Kind == "foo" {
var foo Foo
yaml.Unmarshal(tmp, &foo)
fmt.Printf("foo value is %d\n", foo.FooVal)
}
if spec.Kind == "bar" {
tmp, _ := yaml.Marshal(spec.Spec)
var bar Bar
yaml.Unmarshal(tmp, &bar)
fmt.Printf("bar value is %d\n", bar.BarVal)
}
但它需要额外的步骤并消耗更多的内存(真正的yaml文件可能比示例中更大)。是否存在一些更优雅的方法可以将yaml动态地解构为一组有限的结构?
更新:我正在使用 Yaml 解析器。github.com/go-yaml/yaml v2.1.0
开心每一天1111
森林海
相关分类