Home  >  Article  >  Backend Development  >  How do I effectively parse complex YAML files in Go?

How do I effectively parse complex YAML files in Go?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 12:38:02344browse

How do I effectively parse complex YAML files in Go?

Parsing YAML Files in Go

Problem:

You're encountering difficulties parsing a YAML file in Go. Below is the sample YAML file you're attempting to parse:

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

Solution:

To parse the given YAML file, you need to create a struct that accurately reflects its structure. In your case, the YAML file contains nested elements, so your struct should mirror that nesting. The correct struct definition is:

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

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

Now, to unmarshal the YAML file into the Config struct, use the following code:

var config Config

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

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

Advanced Example:

When working with complex YAML files, such as Kubernetes or Google Cloud service YAML, you may need to nest structs to represent complex data structures. For instance, the following YAML defines a Kubernetes service:

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

The corresponding Go struct for this YAML would be:

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

To unmarshal the YAML file into this struct, use the following code:

var service Service

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

fmt.Print(service.Metadata.Name)

The above is the detailed content of How do I effectively parse complex YAML files 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