首页  >  文章  >  后端开发  >  如何在 Go 中解析带有嵌套键值对的 YAML 文件?

如何在 Go 中解析带有嵌套键值对的 YAML 文件?

DDD
DDD原创
2024-11-10 22:05:02364浏览

How to Parse a YAML File with Nested Key-Value Pairs in Go?

在 Go 中解析 YAML 文件

在 Go 中解析 YAML 文件涉及利用 gopkg.in/yaml.v2 提供的 YAML 库。提供的代码旨在解析具有嵌套键值对的 YAML 文件,如下所示:

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

但是,在尝试解析没有附带值的键值对时会出现问题。实现的结构体没有定义这些值,导致解析期间出错。

要解决此问题,请考虑合并真实的 YAML 示例,例如来自 Google Cloud 或 Kubernetes 的 service.yaml:

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

此示例演示了嵌套的键值关系和提供了一个实际用例。相应的 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"`
    }
    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"`
    }
}

为了简化流程,yaml-to-go 和 json-to-go 等服务提供了方便的工具来将 YAML 转换为 Go 结构,使解析任务更易于管理.

最后,要将 YAML 文件解组到您的结构中,您可以使用以下代码:

var service Service

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

此方法允许通过服务结构访问已解析的数据,从而允许您与 Go 应用程序中的 YAML 文件信息进行交互。

以上是如何在 Go 中解析带有嵌套键值对的 YAML 文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn