How do I effectively parse complex YAML files in Go?

Susan Sarandon
Release: 2024-11-09 12:38:02
Original
314 people have browsed it

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
...
Copy after login

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"`
}
Copy after login

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)
Copy after login

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
Copy after login

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"`
}
Copy after login

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)
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template