我发现这个文档可以连接两个字符串,但这在 go 模板中不起作用。
有没有办法在 Go 模板中连接字符串?
使用
delimit
和 slice
的组合,例如
{{ delimit (slice "foo" "bar" "buzz") ", " }}
<!-- returns the string "foo, bar, buzz" -->
最初来自 gohugo 文档
编写一个函数来连接字符串并将其添加到模板中func map:
func join(sep string, s ...string) string {
return strings.Join(s, sep)
}
在解析之前将函数添加到模板中:
t, err := template.New(name).Funcs(template.FuncMap{"join": join}).Parse(text)
在模板中使用它,如下所示:
{{$x := join ", " "hello" "world"}}
我分配给变量
$x
以展示如何在模板表达式中使用函数结果。结果可以直接用作另一个函数的参数,而无需分配给变量。
这是使用切片而不是可变参数的函数版本:
func join(sep string, s []string) string {
return strings.Join(s, sep)
}
像这样使用它,其中
.
是一个切片:
{{$x := join ", " .}}
如果您的目标是直接连接两个字符串进行输出,则使用
{{a}}sep{{b}}
,其中 a
和 b
是字符串,sep
是分隔符。
使用范围将切片连接到输出。这是一个将切片
.
与分隔符 ", "
连接起来的示例。:
{{range $i, $v := .}}{{if $i}}, {{end}}{{$v}}{{end}}
以下是我如何使用 go 模板语言连接两个字符串(这是在 Kubernetes 的 Helm 模板中)。 在本例中,我使用 go 的
printf
函数创建主机名:
host: {{ printf "%v%v" "my-super" ".apps.my.org" }}
为每个值输入
%v
。
输出为:
host: my-super.apps.my.org
你可以在
%v
值之间放置空格,或者逗号,或者其他什么——检查 go 的字符串格式选项以获取更多,嗯,选项!
在模板示例中https://golang.org/src/text/template/example_test.go他们向您展示了如何执行此操作。
总结:
var funcs = template.FuncMap{"join": strings.Join}
...
masterTmpl, err := template.New("master").Funcs(funcs).Parse(master)
示例中还有其他一些巧妙的技巧。
变量覆盖陷阱
如果其他人尝试使用分隔符“连接”可能为空的字符串,请注意
:=
与 =
。后者用于更新变量。
{{- $path := .Values.fileName -}}
{{- if .Values.folder }}
{{- $path = print .Values.folder "/" $path }}
{{- end }}
在 if 内使用
$path := ..
将创建一个作用域为 if 语句的新变量。