首頁  >  文章  >  後端開發  >  如何在 Go 中解析帶有巢狀鍵值對的 YAML 檔案?

如何在 Go 中解析帶有巢狀鍵值對的 YAML 檔案?

DDD
DDD原創
2024-11-10 22:05:02349瀏覽

How to Parse a YAML File with Nested Key-Value Pairs in Go?

在 Go 中解析 YAML 檔案

在 Go 中解析 YAML 檔案涉及利用 gopkg.in/yaml.v2 提供的 YAML 函式庫。提供的程式碼旨在解析具有巢狀鍵值對的 YAML 文件,如下所示:

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

但是,在嘗試解析沒有附帶值的鍵值對時會出現問題。實現的結構體沒有定義這些值,導致解析期間出錯。

要解決此問題,請考慮合併真實的YAML 範例,例如來自Google Cloud 或Kubernetes 的service.yaml:

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

此範例示範了巢狀的鍵值關係和提供了一個實際用例。對應的Go 結構類似於:

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"`
    }
    Spec struct {
        Type     string `yaml:"type"`
        Selector struct {
            App string `yaml:"app"`
        }
        Ports []struct {
            Name       string `yaml:"name"`
            Port       int    `yaml:"port"`
            TargetPort int    `yaml:"targetPort"`
            NodePort   int    `yaml:"nodePort,omitempty"`
        } `yaml:"ports"`
    }
}

為了簡化流程,yaml-to-go 和json-to-go 等服務提供了方便的工具來將YAML 轉換為Go 結構,使解析任務更易於管理.

最後,要將YAML文件解組到您的結構中,您可以使用以下程式碼:

var service Service

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

此方法允許透過服務結構存取已解析的數據,從而允許您與Go 應用程式中的YAML 檔案資訊進行交互。

以上是如何在 Go 中解析帶有巢狀鍵值對的 YAML 檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn