Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah cara saya menghuraikan fail YAML kompleks dalam Go dengan berkesan?

Bagaimanakah cara saya menghuraikan fail YAML kompleks dalam Go dengan berkesan?

Susan Sarandon
Lepaskan: 2024-11-09 12:38:02
asal
365 orang telah melayarinya

How do I effectively parse complex YAML files in Go?

Menghuraikan Fail YAML dalam Go

Masalah:

Anda menghadapi kesukaran menghuraikan Fail YAML dalam Go. Di bawah ialah contoh fail YAML yang anda cuba huraikan:

---
firewall_network_rules:
  rule1:
    src:       blablabla-host
    dst:       blabla-hostname
...
Salin selepas log masuk

Penyelesaian:

Untuk menghuraikan fail YAML yang diberikan, anda perlu mencipta struct yang mencerminkan strukturnya dengan tepat. Dalam kes anda, fail YAML mengandungi elemen bersarang, jadi struct anda harus mencerminkan sarang itu. Definisi struct yang betul ialah:

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

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

Sekarang, untuk menyahmarshal fail YAML ke dalam struct Config, gunakan kod berikut:

var config Config

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

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

Contoh Lanjutan:

Apabila bekerja dengan fail YAML yang kompleks, seperti Kubernetes atau perkhidmatan Google Cloud YAML, anda boleh perlu menyusun struct untuk mewakili struktur data yang kompleks. Sebagai contoh, YAML berikut mentakrifkan perkhidmatan 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
Salin selepas log masuk

Struktur Go yang sepadan untuk YAML ini ialah:

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"`
}
Salin selepas log masuk

Untuk menyahmarshal fail YAML ke dalam struct ini, gunakan kod berikut:

var service Service

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

fmt.Print(service.Metadata.Name)
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah cara saya menghuraikan fail YAML kompleks dalam Go dengan berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan