Heim >Backend-Entwicklung >Golang >Wie analysiere ich komplexe YAML-Dateien effektiv in Go?

Wie analysiere ich komplexe YAML-Dateien effektiv in Go?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 12:38:02374Durchsuche

How do I effectively parse complex YAML files in Go?

YAML-Dateien in Go analysieren

Problem:

Sie stoßen auf Schwierigkeiten beim Parsen von a YAML-Datei in Go. Unten ist die Beispiel-YAML-Datei, die Sie zu analysieren versuchen:

---
firewall_network_rules:
  rule1:
    src:       blablabla-host
    dst:       blabla-hostname
...

Lösung:

Um die angegebene YAML-Datei zu analysieren, müssen Sie eine Struktur erstellen, die spiegelt seine Struktur genau wider. In Ihrem Fall enthält die YAML-Datei verschachtelte Elemente, daher sollte Ihre Struktur diese Verschachtelung widerspiegeln. Die korrekte Strukturdefinition lautet:

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

type Config struct {
    FirewallNetworkRules map[string][]FirewallNetworkRule `yaml:"firewall_network_rules"`
}

Um nun die YAML-Datei in die Config-Struktur zu entmarshalieren, verwenden Sie den folgenden Code:

var config Config

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

fmt.Printf("Value: %#v\n", config.FirewallNetworkRules)

Erweitertes Beispiel:

Wenn Sie mit komplexen YAML-Dateien wie Kubernetes oder dem Google Cloud-Dienst YAML arbeiten, müssen Sie möglicherweise Strukturen verschachteln, um komplexe Datenstrukturen darzustellen. Beispielsweise definiert die folgende YAML einen Kubernetes-Dienst:

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

Die entsprechende Go-Struktur für diese YAML wäre:

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"`
}

Um die YAML-Datei in dieser Struktur zu entmarshalieren, verwenden Sie die folgenden Code:

var service Service

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

fmt.Print(service.Metadata.Name)

Das obige ist der detaillierte Inhalt vonWie analysiere ich komplexe YAML-Dateien effektiv in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn