yamlフィールドをGo
種類: "bar" 仕様: BARVAL:5
kind: "foo"
spec:
fooVal: 4
kind: "bar"
spec:
barVal: 5
1つのアプローチは、MAP [String]インターフェイス{}をSPECフィールドのタイプとして使用することです。ただし、このアプローチは、特に大規模なYAMLファイルの場合、追加の複雑さとメモリ消費につながる可能性があります。 unmarshal func(interface {})エラー } func(n *yamlnode)unmarshalyaml(unmarshal func(interface {})エラー)エラー{ n.Marshal = unmarshal nilを返します }
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"`
}
型spec struct { Kind String `Yaml:" Kind "` Spec Interface {} `yaml:" - "json:" - "` }
これらの変更により、仕様のunmarshalyaml関数は、仕様フィールドを特定の構造タイプに動的に解析および除外できます。 タイプS仕様 タイプt struct { s `yaml:"、inline "` spec yamlnode `yaml:" spec "` } obj:=&t {} err:= unmarshal(obj); err!= nil { errを返します } *s = spec(obj.s) Switch S.Kind { ケース「フー」: s.spec = new(foo) ケース「バー」: s.spec = new(bar) デフォルト: パニック(「種類の不明」) } obj.spec.unmarshal(s.spec)を返す }
このアプローチは、YAMLフィールドを有限の構造体に動的に解析するためのよりエレガントで効率的なソリューションを提供し、コードとYAMLファイルをよりクリーンで管理しやすくします。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3