Maison > développement back-end > Golang > le corps du texte

Unmarshal yaml mappant les clés de dict aux propriétés de la structure

WBOY
Libérer: 2024-02-09 15:40:29
avant
923 Les gens l'ont consulté

解组 yaml 将 dict 键映射到结构属性

l'éditeur php Xigua vous présente aujourd'hui une technique très utile : désorganiser YAML dans un dictionnaire et mapper les clés aux attributs structurels. YAML est un format léger de sérialisation de données couramment utilisé pour les fichiers de configuration et l'échange de données. En désorganisant YAML, nous pouvons le convertir en dictionnaire, puis mapper les clés du dictionnaire aux propriétés structurelles, ce qui nous permet d'effectuer plus facilement d'autres opérations et traitements dans le code. Cette technique est très utile lorsqu'il s'agit de fichiers de configuration ou de chargement de données à partir de sources de données externes. Jetons un coup d'œil à la méthode d'implémentation spécifique !

Contenu de la question

J'ai cherché ici pendant un moment mais je n'ai pas trouvé de réponse appropriée :

J'essaie de désorganiser une clé de dict yaml sur les attributs d'une structure au lieu de clés mappées. Compte tenu de ce yaml

commands:
    php:
        service: php
        bin: /bin/php
    node:
        service: node
        bin: /bin/node
Copier après la connexion

J'ai pu le regrouper dans une structure comme celle-ci :

type config struct {
    commands map[string]struct {
        service string
        bin     string
    }
}
Copier après la connexion

Mais comment puis-je le déconstruire en une structure comme celle-ci :

type Config struct {
    Commands []struct {
        Name    string    // <-- this should be key from the yaml (i.e. php or node)
        Service string
        Bin     string
    }
}
Copier après la connexion

Merci d'avance pour votre aide

Solution de contournement

Vous pouvez écrire un unmarshaller personnalisé comme celui-ci (terrain de jeu en déplacement) :

package main

import (
    "fmt"

    "gopkg.in/yaml.v3"
)

var input []byte = []byte(`
commands:
    php:
        service: php
        bin: /bin/php
    node:
        service: node
        bin: /bin/node
`)

type Command struct {
    Service string
    Bin     string
}

type NamedCommand struct {
    Command
    Name string
}

type NamedCommands []NamedCommand

type Config struct {
    Commands NamedCommands
}

func (p *NamedCommands) UnmarshalYAML(value *yaml.Node) error {
    if value.Kind != yaml.MappingNode {
        return fmt.Errorf("`commands` must contain YAML mapping, has %v", value.Kind)
    }
    *p = make([]NamedCommand, len(value.Content)/2)
    for i := 0; i < len(value.Content); i += 2 {
        var res = &(*p)[i/2]
        if err := value.Content[i].Decode(&res.Name); err != nil {
            return err
        }
        if err := value.Content[i+1].Decode(&res.Command); err != nil {
            return err
        }
    }
    return nil
}

func main() {
    var f Config
    var err error
    if err = yaml.Unmarshal(input, &f); err != nil {
        panic(err)
    }
    for _, cmd := range f.Commands {
        fmt.Printf("%+v\n", cmd)
    }
}
Copier après la connexion

J'ai divisé les données de commande en commandnamedcommand 以使代码更简单,因为您只需调用 decode 即可提供嵌入的 command valeurs de la structure. Si tout est dans la même structure, vous devrez mapper manuellement les clés aux champs de structure.

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!