来到编程网的大家,相信都是编程学习爱好者,希望在这里学习golang相关编程知识。下面本篇文章就来带大家聊聊《使用文本/模板包执行 YAML 时确保类型是列表》,介绍一下,希望对大家的知识积累有所帮
来到编程网的大家,相信都是编程学习爱好者,希望在这里学习golang相关编程知识。下面本篇文章就来带大家聊聊《使用文本/模板包执行 YAML 时确保类型是列表》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!
问题内容我正在使用 text/template
包动态构建我的 k8s 清单,并且我几乎成功地创建了所需的输出。
由于目标类型是 yaml,我想确保 .ownerreferences
和 .secrets
的生成类型在 yaml 中创建为列表类型,即每个条目上都有一个前导 -
。
我期望达到的输出是
---
apiversion: v1
kind: serviceaccount
metadata:
name: foobar
labels:
app: foobar
ownerreferences:
- uid: 123456789
kind: foobarorchestrator
secrets:
- name: thisisasecret1
- name: thisisasecret2
但是通过我的尝试
package main
import (
"os"
"text/template"
)
const serviceaccounttemplate = `---
apiversion: v1
kind: serviceaccount
metadata:
name: {{.name}}
{{- if .labels}}
labels:
{{- end }}
{{- range $key, $value := .labels }}
{{ $key }}: {{ $value }}
{{- end }}
{{- if .ownerref}}
ownerreferences:
{{- end }}
{{- range .ownerref }}
uid: {{ .uid }}
kind: {{ .kind }}
{{- end }}
{{- if .secrets}}
secrets:
{{- end }}
{{- range $value := .secrets }}
name: {{ $value }}
{{- end }}
`
func main() {
type ownerref struct {
uid string
kind string
}
data := struct {
name string
secrets []string
labels map[string]string
ownerref []ownerref
}{
"dude",
[]string{"thisisasecret1", "thisisasecret2"},
map[string]string{"app": "foobar"},
[]ownerref{ownerref{uid: "123456789", kind: "foobar"}},
}
t := template.new("t")
t, err := t.parse(serviceaccounttemplate)
if err != nil {
panic(err)
}
err = t.execute(os.stdout, data)
if err != nil {
panic(err)
}
}
我能够生成以下内容
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: dude
labels:
app: Foobar
ownerReferences:
uid: 123456789
kind: Foobar
secrets:
name: thisisasecret1
name: thisisasecret2
但我想确定类型是否准确,可以被正确的 yaml 解码器接受。
也希望对我现有的模板定义进行任何增强。
演示链接 - https://Go.dev/play/p/ebxcvGCyr9r
要使示例模板输出所需节点的 yaml 序列,您只需在子节点前面添加 -
即可。例如
const serviceAccountTemplate = `
...
{{- if .OwnerRef}}
ownerReferences:
{{- end }}
{{- range .OwnerRef }}
- uid: {{ .UID }}
kind: {{ .Kind }}
{{- end }}
{{- if .Secrets}}
secrets:
{{- end }}
{{- range $value := .Secrets }}
- name: {{ $value }}
{{- end }}
`
Https://go.dev/play/p/R86Feu5VZOK
但是 text/template
不支持检查 yaml 语法是否正确。如果您需要保证生成的文本是有效的 yaml,您必须为此编写测试。
但是,就像当您想在 go 中生成 JSON 时,您通常会使用结构和 encoding/json
一样,对于 yaml,您也可以使用结构和 gopkg.in/yaml.v3
来生成一致有效的 yaml。 p>
今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注编程网公众号,一起学习编程~
--结束END--
本文标题: 使用文本/模板包执行 YAML 时确保类型是列表
本文链接: https://lsjlt.com/news/596156.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0