Analyse dynamique des clés en YAML avec Golang
Introduction
YAML (YAML n'est pas Markup Language) est un format de sérialisation de données largement utilisé qui permet une représentation flexible des données. Cependant, l'analyse des fichiers YAML avec des clés dynamiques (c'est-à-dire des clés qui peuvent varier) pose un défi dans Go car le langage s'appuie fortement sur des structures typées statiquement.
Description du problème
Vous disposez d'un fichier YAML dont les clés représentent différentes versions (par exemple, V1, V2, V3). L'utilisateur peut spécifier les versions qu'il prend en charge, et les clés peuvent ne pas être dans l'ordre ou ignorer les versions. Vous souhaitez analyser ce fichier YAML dans une structure Go, mais les champs de la structure doivent correspondre aux clés dynamiques.
Approche incorrecte
Au départ, vous avez tenté d'analyser le YAML fichier dans une structure d'environnement, en s'attendant à ce que les clés soient présentes au niveau racine. Cependant, le type réel de l'élément racine est une carte de chaînes (représentant les noms d'environnement) vers les structures d'environnement.
Solution
Pour analyser YAML avec des clés dynamiques, vous vous devez utiliser une méthode UnmarshalYAML personnalisée sur la structure qui analysera les clés et construira la structure correcte. Dans ce cas, la structure Environment nécessite une méthode UnmarshalYAML pour désorganiser la racine sous forme de carte, puis analyser les environnements individuels.
Exemple de code
Voici un exemple de Méthode UnmarshalYAML personnalisée pour la structure Environment :
<code class="go">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 MajorVersion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
Cette méthode démarshale d'abord le champ booléen SkipHeaderValidation. Ensuite, il tente de regrouper le reste des données dans une carte des noms de versions vers les structures MajorVersion. Cependant, comme les données non marshalées sont un mélange de structures booléennes et MajorVersion, une erreur yaml.TypeError sera générée. Le code ignore cette erreur et attribue la carte des versions non marshalées au champ Versions de la structure Environnement.
Exemple d'utilisation
Avec la méthode UnmarshalYAML personnalisée en place, vous pouvez maintenant, désassemblez correctement les données YAML :
<code class="go">var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e)</code>
Cela produira le résultat suivant :
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, }, }, }, }
Cela démontre l'analyse réussie du fichier YAML avec des clés dynamiques dans une structure Go.
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!