"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How to Parse a YAML File with Nested Key-Value Pairs in Go?

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

Published on 2024-11-16
Browse:668

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

Parsing a YAML File in Go

Parsing YAML files in Go involves utilizing the YAML library available through gopkg.in/yaml.v2. The provided code is designed to parse a YAML file with nested key-value pairs, like the following:

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

However, issues arise when attempting to parse key-value pairs without accompanying values. The implemented struct does not define these values, leading to an error during parsing.

To address this issue, consider incorporating a real-world YAML example, such as a service.yaml from Google Cloud or 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

This example demonstrates nested key-value relationships and provides a practical use case. The corresponding Go struct would resemble:

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

To simplify the process, services like yaml-to-go and json-to-go provide convenient tools for converting YAML to Go structs, making the parsing task more manageable.

Finally, to unmarshal the YAML file into your struct, you can use the following code:

var service Service

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

This approach enables access to the parsed data through the service struct, allowing you to interact with the YAML file's information in your Go application.

Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3