在 Go 中處理 YAML 檔案時,您可能會遇到檔案中金鑰名稱不同的情況。這通常用於 API 版本控製或動態配置目的。為了有效解析此類 YAML 結構,您需要採用自訂解析策略。
在 API 版本控制的上下文中,可以擁有一個包含代表不同版本的鍵的 YAML 文件,例如“V1”、“V2”、“V3”等。問題是這些版本可能不會總是出現在文件中,而且它們的順序可能不一致。
要解決此問題,請考慮為對應的版本實作自訂 Unmarshaler資料結構。這允許您控制解組過程並處理動態鍵值。
<code class="go">package main import ( "fmt" "gopkg.in/yaml.v2" ) type MajorVersion struct { Current string `yaml:"current"` MimeTypes []string `yaml:"mime_types"` SkipVersionValidation bool `yaml:"skip-version-validation"` SkipMimeTypeValidation bool `yaml:"skip-mime-type-validation"` } 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(&params); 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 MajorVersion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil } func main() { var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e) }</code>
透過為環境結構定義自訂解組器,您可以有效地處理 YAML 檔案中的布林結構和巢狀結構。
自訂解組器提供了一種強大的方法來解析 Golang 中複雜且動態的 YAML 結構。透過實現自訂的解組邏輯,您可以使資料結構適應不同的關鍵格式,從而在結構可能隨時間變化的情況下更輕鬆地使用 YAML 檔案。
以上是如何使用 Go 解析 YAML 中的動態鍵?的詳細內容。更多資訊請關注PHP中文網其他相關文章!