美文网首页
go实现多文档yaml文件解析问题

go实现多文档yaml文件解析问题

作者: Li_MAX | 来源:发表于2020-09-11 13:52 被阅读0次

go解析yaml文件,如果是单文档类似下图:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.12
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80

直接使用

yaml := []byte{}
var data interface{}
err := goyaml.Unmarshal(yaml, &data)

如果使用"---"分割的多文档yaml文件,类似下文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: harbor.xxx.cn/official_hub/nginx:1.13-alpine
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service-nodeport
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    name: nginx

解析方法

import goyaml "gopkg.in/yaml.v2"

func Test_Upload(t *testing.T)  {
    file,_ := os.Open(filePath)
    dec := goyaml.NewDecoder(file)
    var data interface{}
    for dec.Decode(&data) == nil {
        fmt.Println(data)
    }
}

附带data数据类型转换

func transformData(data *interface{}) (err error) {
    switch in := (*data).(type) {
    case map[interface{}]interface{}:
        m := make(map[string]interface{}, len(in))
        for k, v := range in {
            if err = transformData(&v); err != nil {
                return err
            }
            var sk string
            switch k.(type) {
            case string:
                sk = k.(string)
            case int:
                sk = strconv.Itoa(k.(int))
            default:
                return fmt.Errorf("类型不匹配: 期望映射字符串或int类型; 当前类型: %T", k)
            }
            m[sk] = v
        }
        *data = m
    case []interface{}:
        for i := len(in) - 1; i >= 0; i-- {
            if err = transformData(&in[i]); err != nil {
                return err
            }
        }
    }
    return nil
}

相关文章

  • go实现多文档yaml文件解析问题

    go解析yaml文件,如果是单文档类似下图: 直接使用 如果使用"---"分割的多文档yaml文件,类似下文件 解...

  • JAVA虚拟机之ClassLoader

    问题 今天遇到一个问题,使用YAML解析yaml文件的时候,报pojo类找不到。这种问题一般来说,都是ClassL...

  • Istio 流程图

    yaml文件给Api Server,Api Server 解析yaml文件生成资源并保存etcd istiod p...

  • 2019-07-06

    解析yaml配置文件,找到相关文件,进行权限更改

  • kubernetes ingress 301问题

    问题:按照官方文档搭建ingress后,请求url都会返回301。 解决方法: 完整yaml文件:

  • go使用yaml解析

    golang解析yaml遇到的坑[https://www.jianshu.com/p/d76c29b38ed8] ...

  • Golang项目中引入yaml.v2配置文件

    在Go语言项目中,常用的配置文件yaml、toml、json、xml、ini几种,因为本章主要讲解yaml配置文件...

  • Golang之数组和切片

    引用 数组、字符串和切片 Go数组中的索引问题 深入解析 Go 中 Slice 底层实现 Golang 入门 : ...

  • YAML 教程

    目录 YAML 的名字? YAML 的特点 YAML 需要注意的 YAML 基本使用后缀名键值对列表注释多文档Pa...

  • beego配置

    beego 目前支持 INI、XML、JSON、YAML 格式的配置文件解析,但是默认采用了 INI 格式解析,用...

网友评论

      本文标题:go实现多文档yaml文件解析问题

      本文链接:https://www.haomeiwen.com/subject/pgovektx.html