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

2020-09-11  本文已影响0人  Li_MAX

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
}
上一篇 下一篇

猜你喜欢

热点阅读