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
}
网友评论