Go模板删除范围循环中的最后一个逗号

Go模板删除范围循环中的最后一个逗号,go,go-templates,Go,Go Templates,我有这样的代码: package main import ( "text/template" "os" ) func main() { type Map map[string]string m := Map { "a": "b", "c": "d", } const temp = `{{range $key, $value := $}}key:{{$key}} value:{{$value}},{{end}}`

我有这样的代码:

package main

import (
    "text/template"
    "os"
)

func main() {
    type Map map[string]string
    m := Map {
        "a": "b",
        "c": "d",
    }
    const temp = `{{range $key, $value := $}}key:{{$key}} value:{{$value}},{{end}}`
    t := template.Must(template.New("example").Parse(temp))
    t.Execute(os.Stdout, m)
}
    {{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}key:{{$key}} value:{{$value}}{{end}}
{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}
它将输出:

键:a值:b,键:c值:d

但我想要这样的东西:

package main

import (
    "text/template"
    "os"
)

func main() {
    type Map map[string]string
    m := Map {
        "a": "b",
        "c": "d",
    }
    const temp = `{{range $key, $value := $}}key:{{$key}} value:{{$value}},{{end}}`
    t := template.Must(template.New("example").Parse(temp))
    t.Execute(os.Stdout, m)
}
    {{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}key:{{$key}} value:{{$value}}{{end}}
{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}
键:a值:b,键:c值:d


我不需要最后一个逗号,如何删除它。我在这里找到了一个循环数组的解决方案:,但我无法获取映射的索引。

以下是如何使用模板函数编写逗号分隔的键值对

声明一个函数,该函数返回递增并返回计数器的函数:

func counter() func() int {
    i := -1
    return func() int {
        i++
        return i
    }
}
将此函数添加到模板中:

t := template.Must(template.New("example").Funcs(template.FuncMap{"counter": counter}).Parse(temp))
t := template.Must(template.New("example").Funcs(template.FuncMap{"separator": separator}).Parse(temp))
在模板中使用它,如下所示:

package main

import (
    "text/template"
    "os"
)

func main() {
    type Map map[string]string
    m := Map {
        "a": "b",
        "c": "d",
    }
    const temp = `{{range $key, $value := $}}key:{{$key}} value:{{$value}},{{end}}`
    t := template.Must(template.New("example").Parse(temp))
    t.Execute(os.Stdout, m)
}
    {{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}key:{{$key}} value:{{$value}}{{end}}
{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}
此模板在键值对之前写入分隔符,而不是在键值对之后写入分隔符

计数器在循环之前创建,并在循环的每次迭代中递增。分隔符不是第一次通过循环写入的

通过将if语句移动到Go代码,可以简化模板中的逻辑:

func separator(s string) func() string {
    i := -1
    return func() string {
        i++
        if i == 0 {
            return ""
        }
        return s
    }
}
将函数添加到模板中:

t := template.Must(template.New("example").Funcs(template.FuncMap{"counter": counter}).Parse(temp))
t := template.Must(template.New("example").Funcs(template.FuncMap{"separator": separator}).Parse(temp))
像这样使用它:

package main

import (
    "text/template"
    "os"
)

func main() {
    type Map map[string]string
    m := Map {
        "a": "b",
        "c": "d",
    }
    const temp = `{{range $key, $value := $}}key:{{$key}} value:{{$value}},{{end}}`
    t := template.Must(template.New("example").Parse(temp))
    t.Execute(os.Stdout, m)
}
    {{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}key:{{$key}} value:{{$value}}{{end}}
{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}
自从Go 1.11以来。这使我们可以在不需要自定义函数(在模板之外)的情况下执行此操作

以下模板将执行以下操作:

{{$first := true}}
{{range $key, $value := $}}
    {{if $first}}
        {{$first = false}}
    {{else}}
        ,
    {{end}}
    key:{{$key}} value:{{$value}}
{{end}}
下面是问题中经过修改的工作示例:

type Map map[string]string
m := Map{
    "a": "b",
    "c": "d",
    "e": "f",
}
const temp = `{{$first := true}}{{range $key, $value := $}}{{if $first}}{{$first = false}}{{else}}, {{end}}key:{{$key}} value:{{$value}}{{end}}`
t := template.Must(template.New("example").Parse(temp))
t.Execute(os.Stdout, m)
哪些输出(在上尝试):


可在模板中撤消。您必须在Go代码中直接执行此操作,或者在模板中公开TrimTrailingComma之类的函数。谢谢,我会找到其他方法来解决此问题。我认为最优雅的解决方案可以通过以下问题/答案找到:@jboschiero优雅的解决方案适用于切片,而不是贴图。@Volker从Go 1.11开始,这是可能的。请看。正如@Volker所说,在模板中无法做到这一点,也许这是最好的解决方案。您知道我需要哪个版本的Docker才能工作吗?太好了,当存在嵌套循环时,这将大大简化。