如何在Go模板中连接两个字符串?

问题描述 投票:0回答:5

我发现这个文档可以连接两个字符串,但这在 go 模板中不起作用。

有没有办法在 Go 模板中连接字符串?

string go-templates
5个回答
6
投票

使用

delimit
slice
的组合,例如

{{ delimit (slice "foo" "bar" "buzz") ", " }}
<!-- returns the string "foo, bar, buzz" -->

最初来自 gohugo 文档


5
投票

编写一个函数来连接字符串并将其添加到模板中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}}

游乐场示例


4
投票

以下是我如何使用 go 模板语言连接两个字符串(这是在 Kubernetes 的 Helm 模板中)。 在本例中,我使用 go 的

printf
函数创建主机名:

host: {{ printf "%v%v" "my-super" ".apps.my.org" }}

为每个值输入

%v

输出为:

host: my-super.apps.my.org

你可以在

%v
值之间放置空格,或者逗号,或者其他什么——检查 go 的字符串格式选项以获取更多,嗯,选项!


2
投票

在模板示例中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)

示例中还有其他一些巧妙的技巧。


0
投票

变量覆盖陷阱

如果其他人尝试使用分隔符“连接”可能为空的字符串,请注意

:=
=
。后者用于更新变量。

{{- $path := .Values.fileName -}}
{{- if .Values.folder }}
{{-   $path = print .Values.folder "/" $path }}
{{- end }}

在 if 内使用

$path := ..
将创建一个作用域为 if 语句的新变量。

© www.soinside.com 2019 - 2024. All rights reserved.