Maison >développement back-end >Golang >Comment analyser YAML avec des clés dynamiques dans Go à l'aide d'un Unmarshaler personnalisé ?
Analyse de YAML avec Dynamic Key dans Go
Ce problème survient lors de l'analyse de fichiers YAML avec des clés qui peuvent varier en fonction des versions d'API définies par l'utilisateur . L'utilisateur peut omettre ou organiser les versions selon ses besoins (par exemple, V0, V2, V5).
Approche originale avec structure d'environnement
L'approche initiale consiste à analyser le YAML comme une structure d'environnement. Cependant, le type réel des données analysées est map[string]Environment.
<code class="go">type Environment struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` Version map[string]MajorVersion }</code>
Pour résoudre ce problème, nous avons besoin d'un Unmarshaler personnalisé.
Unmarshaler personnalisé pour l'environnement
Nous créons une méthode Unmarshaler personnalisée pour le type d'environnement qui analyse à la fois les clés statiques et dynamiques.
<code class="go">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 { // Expect error here due to boolean to MajorVersion conversion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
Analyse et sortie modifiées
Nous pouvons maintenant modifier notre code d'analyse pour gérer les clés dynamiques et finalement renvoyer la structure de données souhaitée.
Fonction principale modifiée
<code class="go">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>
Sortie
La sortie reflétera désormais la structure de données attendue avec les clés dynamiques analysées en conséquence.
map[string]main.Environment{ "development": { SkipHeaderValidation: true, Versions: { "V2": { Current: "2.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: false, SkipMimeTypeValidation: false, }, "V1": { Current: "1.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: true, SkipMimeTypeValidation: true, }, }, }, }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!