首页 > 后端开发 > Golang > 如何在 Go 中有效解析复杂的 YAML 文件?

如何在 Go 中有效解析复杂的 YAML 文件?

Susan Sarandon
发布: 2024-11-09 12:38:02
原创
364 人浏览过

How do I effectively parse complex YAML files in Go?

在 Go 中解析 YAML 文件

问题:

您在解析Go 中的 YAML 文件。下面是您尝试解析的示例 YAML 文件:

---
firewall_network_rules:
  rule1:
    src:       blablabla-host
    dst:       blabla-hostname
...
登录后复制

解决方案:

要解析给定的 YAML 文件,您需要创建一个结构体准确地反映其结构。在您的情况下,YAML 文件包含嵌套元素,因此您的结构应该镜像该嵌套。正确的结构定义是:

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

type Config struct {
    FirewallNetworkRules map[string][]FirewallNetworkRule `yaml:"firewall_network_rules"`
}
登录后复制

现在,要将 YAML 文件解组到 Config 结构中,请使用以下代码:

var config Config

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

fmt.Printf("Value: %#v\n", config.FirewallNetworkRules)
登录后复制

高级示例:

使用复杂的 YAML 文件(例如 Kubernetes 或 Google Cloud 服务 YAML)时,您可能需要嵌套结构来表示复杂的数据结构。例如,以下 YAML 定义了 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
登录后复制

此 YAML 对应的 Go 结构将是:

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"`
}
登录后复制

要将 YAML 文件解组到此结构中,请使用以下代码:

var service Service

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

fmt.Print(service.Metadata.Name)
登录后复制

以上是如何在 Go 中有效解析复杂的 YAML 文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板