进入模板去除范围内循环的最后一个逗号

Chr*_*ris 8 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}}`
    t := template.Must(template.New("example").Parse(temp))
    t.Execute(os.Stdout, m)
}
Run Code Online (Sandbox Code Playgroud)

它会输出:

键:一个值:B,键:C值:d,

但我想是这样的:

键:一个值:B,键:C值:d

我并不需要最后一个逗号,如何删除它。我发现了一个解决方案,在这里循环数组:https://groups.google.com/d/msg/golang-nuts/XBScetK-guk/Bh7ZFz6R3wQJ,但我不能对地图获得指标。

Cer*_*món 7

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

声明返回一个函数,增量和返回计数器的功能:

func counter() func() int {
    i := -1
    return func() int {
        i++
        return i
    }
}
Run Code Online (Sandbox Code Playgroud)

将此功能添加到模板中:

t := template.Must(template.New("example").Funcs(template.FuncMap{"counter": counter}).Parse(temp))
Run Code Online (Sandbox Code Playgroud)

像这样在模板中使用它:

    {{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}key:{{$key}} value:{{$value}}{{end}}
Run Code Online (Sandbox Code Playgroud)

该模板对之后,而不是键值对以前写的分隔符。

计数器循环之前创建的递增通过循环每次迭代。分隔不通过循环编写的第一次。

在操场上跑步。

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

func separator(s string) func() string {
    i := -1
    return func() string {
        i++
        if i == 0 {
            return ""
        }
        return s
    }
}
Run Code Online (Sandbox Code Playgroud)

将功能添加到模板:

t := template.Must(template.New("example").Funcs(template.FuncMap{"separator": separator}).Parse(temp))
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}
Run Code Online (Sandbox Code Playgroud)

在操场上跑


icz*_*cza 6

从Go 1.11开始,现在可以更改模板变量的值。这使我们可以在不需要自定义功能的情况下(位于模板外部)执行此操作。

以下模板可以做到这一点:

{{$first := true}}
{{range $key, $value := $}}
    {{if $first}}
        {{$first = false}}
    {{else}}
        ,
    {{end}}
    key:{{$key}} value:{{$value}}
{{end}}
Run Code Online (Sandbox Code Playgroud)

这是问题中更改后的工作示例:

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)
Run Code Online (Sandbox Code Playgroud)

哪些输出(在Go Playground上尝试):

key:a value:b, key:c value:d, key:e value:f
Run Code Online (Sandbox Code Playgroud)