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

How can I join two strings in go templates?

我在 join two strings 找到了这个文档,但这在 go 模板中不起作用。

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

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

playground example

我分配给变量 $x 以显示如何在模板表达式中使用函数结果。结果可以直接用作另一个函数的参数,而无需分配给变量。

这是使用切片而不是可变参数的函数版本:

func join(sep string, s []string) string {
    return strings.Join(s, sep)
}

像这样使用它,其中 . 是一个切片:

{{$x := join ", " .}}  

playground example.

如果您的目标是直接连接两个字符串进行输出,则使用 {{a}}sep{{b}},其中 ab 是字符串,sep 是分隔符.

使用范围将切片连接到输出。这是一个将切片 . 与分隔符 ", " 连接起来的示例。:

{{range $i, $v := .}}{{if $i}}, {{end}}{{$v}}{{end}}

playground example.

使用 delimitslice 的组合,例如

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

最初来自gohugo docs

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

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

下面是我如何用 go 模板语言连接两个字符串(这是在 Kubernetes 的 Helm 模板中)。在这种情况下,我使用 go 的 printf 函数创建主机名:

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

为每个值输入 %v

输出为:

host: my-super.apps.my.org

您可以在 %v 值、逗号或其他任何内容之间放置空格——查看 go 的字符串格式选项以获得更多选项!