一尘不染

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

go

我有这样的代码:

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)
}

它会输出:

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

但我想要这样的东西:

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

我不需要最后一个逗号,如何删除它。我在这里找到了用于循环数组的解决方案:https : //groups.google.com/d/msg/golang-
nuts/XBScetK-guk/Bh7ZFz6R3wQJ,但是我无法获取地图索引。


阅读 245

收藏
2020-07-02

共1个答案

一尘不染

这是使用模板函数编写逗号分隔的键/值对的方法。

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

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))

像这样在模板中使用它:

    {{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}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{"separator": separator}).Parse(temp))

像这样使用它:

{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}

在操场上跑

2020-07-02