L'éditeur PHP Youzi a mentionné un concept important lors de l'introduction de YAML, qui consiste à utiliser plusieurs clés de mappage complexes comme structure. YAML est un format utilisé pour représenter la sérialisation des données et est hautement lisible par l'homme. Dans YAML, vous pouvez utiliser des structures pour combiner plusieurs paires clé-valeur en un tout, rendant la structure des données plus claire et plus facile à comprendre. Cette approche peut aider les développeurs à mieux organiser et gérer des données complexes et à améliorer la lisibilité et la maintenabilité du code. Dans les applications pratiques, les structures sont une fonctionnalité très utile, jetons-y un coup d'œil !
Je souhaite désorganiser une clé de carte complexe dans une structure :
yaml
unf: item_meta: source: ? id: "aa" name: "bb" : "some value"
Structure
type source struct { id string `yaml:"id"` name string `yaml:"name"` }
Tout fonctionne comme prévu jusqu'à ce que j'ajoute une autre clé :
yaml 2
unf: item_meta: source: ? id: "012" name: "bill" : "some value" ? id: "066" name: "bob" : "another value"
J'ai eu une erreur
"line xxx: mapping key "" already defined at line xxx"
J'ai décidé d'utiliser un pseudo :
yaml 3
unf: item_meta: aliases: - bill: &alias_bill id: "012" name: "Bill" - bob: &alias_bob id: "066" name: "Bob" source: ? *alias_bill : "some value" ? *alias_bob name: "Bob" : "another value"
Problème résolu ! Mais nous utilisons le hiera server
dans la pile hiera server
并且 hiera
et hiera
renvoie le contenu du fichier de configuration remplacé, donc je me suis retrouvé avec la version yaml 2.
p>
hiera 服务器
Des idées sur la façon de résoudre ce problème ? Impossible de configurer
Aller au terrain de jeuSolution
Ma solution est principalement basée sur cette question
@larsksL'idée est de trouver des nœuds avec des clés de carte en double et de créer des valeurs personnalisées à partir du nœud de valeur du nœud de carte. 🎜
func fixYamlNode(node *yaml.Node) { if node.Kind == yaml.MappingNode { length := len(node.Content) for i := 0; i < length; i += 2 { nodes := make([]*yaml.Node, 0) nodes = append(nodes, node.Content[i]) for j := i + 2; j < length; j += 2 { nj := node.Content[j] if nodes[0].Kind == nj.Kind && nodes[0].Value == nj.Value { nodes = append(nodes, nj) } } if len(nodes) == 1 { continue } fillMapValue(nodes) } for i := 1; i < length; i += 2 { valueNode := node.Content[i] fixYamlNode(valueNode) } } } func fillMapValue(nodes []*yaml.Node) { for _, node := range nodes { length := len(node.Content) for i := 0; i < length; i += 2 { node.Value = fmt.Sprintf("%s %s", node.Value, node.Content[i+1].Value) } } }
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!