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