在处理包含动态定义键的 YAML 文件时,Go 的类型系统可能会带来挑战。本文探讨了如何有效解析此类 YAML,同时保持所需的类型结构。
我们遇到了一个 YAML 文件包含变量键(例如“V1”、“V2”等)的示例。将其解析为环境类型的初始方法失败了,导致我们寻求自定义解决方案。
解决方案在于为我们的环境类型实现自定义 UnmarshalYAML 方法。此方法允许我们拦截解组过程并处理动态密钥。更新后的代码:
<code class="go">type Environment struct { SkipHeaderValidation bool Versions map[string]MajorVersion } func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(¶ms); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Here we expect an error because a boolean cannot be converted to a // a MajorVersion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
通过为 Versions 属性定义一个 map[string]MajorVersion,我们启用动态键解析。自定义 UnmarshalYAML 方法根据 YAML 内容动态填充此映射。
现在,当我们解组 YAML 时,我们获得一个 map[string]Environment 作为根类型,每个环境都有一个填充的 Versions 映射。这解决了在 YAML 中解析和表示动态定义的键的挑战。
以上是如何在 Golang 中解析带有动态键的 YAML?的详细内容。更多信息请关注PHP中文网其他相关文章!