Home  >  Article  >  Backend Development  >  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?

DDD
DDDOriginal
2024-11-10 22:05:02348browse

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.

The above is the detailed content of How to Parse a YAML File with Nested Key-Value Pairs in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn