Maison > développement back-end > Golang > yaml utilise plusieurs clés de mappage complexes comme structure

yaml utilise plusieurs clés de mappage complexes comme structure

WBOY
Libérer: 2024-02-09 19:12:09
avant
774 Les gens l'ont consulté

yaml 将多个复杂的映射键作为一个结构体

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 !

Contenu de la question

Je souhaite désorganiser une clé de carte complexe dans une structure :

yaml

unf:
    item_meta:
      source:
        ? id: "aa"
          name: "bb"
        : "some value"
Copier après la connexion

Structure

type source struct {
    id     string `yaml:"id"`
    name   string `yaml:"name"`
}
Copier après la connexion

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"
Copier après la connexion

J'ai eu une erreur

"line xxx: mapping key "" already defined at line xxx"
Copier après la connexion

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"
Copier après la connexion

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 jeu

Solution

Ma solution est principalement basée sur cette question

@larsks

L'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)
        }
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal