Maison > développement back-end > Golang > Comment analyser efficacement des fichiers YAML complexes dans Go ?

Comment analyser efficacement des fichiers YAML complexes dans Go ?

Susan Sarandon
Libérer: 2024-11-09 12:38:02
original
366 Les gens l'ont consulté

How do I effectively parse complex YAML files in Go?

Analyse des fichiers YAML dans Go

Problème :

Vous rencontrez des difficultés pour analyser un Fichier YAML dans Go. Vous trouverez ci-dessous l'exemple de fichier YAML que vous essayez d'analyser :

---
firewall_network_rules:
  rule1:
    src:       blablabla-host
    dst:       blabla-hostname
...
Copier après la connexion

Solution :

Pour analyser le fichier YAML donné, vous devez créer une structure qui reflète fidèlement sa structure. Dans votre cas, le fichier YAML contient des éléments imbriqués, votre structure doit donc refléter cette imbrication. La définition correcte de la structure est :

type FirewallNetworkRule struct {
    Src string `yaml:"src"`
    Dst string `yaml:"dst"`
}

type Config struct {
    FirewallNetworkRules map[string][]FirewallNetworkRule `yaml:"firewall_network_rules"`
}
Copier après la connexion

Maintenant, pour désassembler le fichier YAML dans la structure de configuration, utilisez le code suivant :

var config Config

err := yaml.Unmarshal(yamlFile, &config)
if err != nil {
    panic(err)
}

fmt.Printf("Value: %#v\n", config.FirewallNetworkRules)
Copier après la connexion

Exemple avancé :

Lorsque vous travaillez avec des fichiers YAML complexes, tels que Kubernetes ou le service Google Cloud YAML, vous devrez peut-être imbriquer des structures pour représenter des structures de données complexes. Par exemple, le YAML suivant définit un service Kubernetes :

apiVersion: v1
kind: Service
metadata:
  name: myName
  namespace: default
  labels:
    router.deis.io/routable: "true"
  annotations:
    router.deis.io/domains: ""
spec:
  type: NodePort
  selector:
    app: myName
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
Copier après la connexion

La structure Go correspondante pour ce YAML serait :

type Service struct {
    APIVersion string `yaml:"apiVersion"`
    Kind       string `yaml:"kind"`
    Metadata   struct {
        Name      string `yaml:"name"`
        Namespace string `yaml:"namespace"`
        Labels    struct {
            RouterDeisIoRoutable string `yaml:"router.deis.io/routable"`
        } `yaml:"labels"`
        Annotations struct {
            RouterDeisIoDomains string `yaml:"router.deis.io/domains"`
        } `yaml:"annotations"`
    } `yaml:"metadata"`
    Spec struct {
        Type     string `yaml:"type"`
        Selector struct {
            App string `yaml:"app"`
        } `yaml:"selector"`
        Ports []struct {
            Name       string `yaml:"name"`
            Port       int    `yaml:"port"`
            TargetPort int    `yaml:"targetPort"`
            NodePort   int    `yaml:"nodePort,omitempty"`
        } `yaml:"ports"`
    } `yaml:"spec"`
}
Copier après la connexion

Pour désorganiser le fichier YAML dans cette structure, utilisez le code suivant :

var service Service

err := yaml.Unmarshal(yourFile, &service)
if err != nil {
    panic(err)
}

fmt.Print(service.Metadata.Name)
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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal