使用 go-templates 中的范围检测数组中的最后一项
detect last item inside an array using range inside go-templates
这个程序输出简单
1,4,2,
但我想打印
1,4,2.
如您所见,逗号打印在数组的每个项目之后。
package main
import "os"
import "text/template"
func main() {
params := map[string]interface{}{
"items": [3]int{1, 4, 2},
}
tpl := "{{range $i, $el := .items}}{{$el}},{{end}}"
lister, _ := template.New("foo").Parse(tpl)
lister.Execute(os.Stdout, params)
}
有没有办法改变 {{range $i, $el := .items}}{{$el}},{{end}}
并确保最后一项将打印“.”而不是“,”
您可以使用
tpl := "{{range $i, $el := .items}}{{if $i}},{{end}}{{$el}}{{end}}."
实现这一目标。诀窍是先发出逗号分隔符,而不是范围内的第一项。
在您发布的简单示例中,最简单的是 "fhe" 发布的内容:您可以轻松检查当前索引是否为第一个,并在非第一个元素后输出一个逗号。最后输出一个尾随点。
如果在更复杂的例子中你确实需要检测最后一个
项目,或者可能是您迭代的列表可能是空的(因此尾随点将是一个错误),您可以注册一个自定义函数来判断当前索引是否是最后一个:
lister := template.Must(template.New("foo").Funcs(template.FuncMap{
"IsLast": func(i, size int) bool { return i == size-1 },
}).Parse(tpl))
然后使用以下模板:
tpl := "{{range $i, $el := .items}}{{$el}}{{if IsLast $i (len $.items)}}.{{else}},{{end}}{{end}}"
那么输出将是(在Go Playground上试试):
1,4,2.
这个的一个变体可以是注册一个自定义函数,它根据长度(lastIdx = length - 1
)计算最后一个索引,然后在 {{range}}
中你可以做一个简单的比较:
tpl := "{{$lastIdx := LastIdx (len .items)}}{{range $i, $el := .items}}{{$el}}{{if eq $lastIdx $i}}.{{else}},{{end}}{{end}}"
lister := template.Must(template.New("foo").Funcs(template.FuncMap{
"LastIdx": func(size int) int { return size - 1 },
}).Parse(tpl))
输出将相同。在 Go Playground.
上试用
这个程序输出简单
1,4,2,
但我想打印
1,4,2.
如您所见,逗号打印在数组的每个项目之后。
package main
import "os"
import "text/template"
func main() {
params := map[string]interface{}{
"items": [3]int{1, 4, 2},
}
tpl := "{{range $i, $el := .items}}{{$el}},{{end}}"
lister, _ := template.New("foo").Parse(tpl)
lister.Execute(os.Stdout, params)
}
有没有办法改变 {{range $i, $el := .items}}{{$el}},{{end}}
并确保最后一项将打印“.”而不是“,”
您可以使用
tpl := "{{range $i, $el := .items}}{{if $i}},{{end}}{{$el}}{{end}}."
实现这一目标。诀窍是先发出逗号分隔符,而不是范围内的第一项。
在您发布的简单示例中,最简单的是 "fhe" 发布的内容:您可以轻松检查当前索引是否为第一个,并在非第一个元素后输出一个逗号。最后输出一个尾随点。
如果在更复杂的例子中你确实需要检测最后一个 项目,或者可能是您迭代的列表可能是空的(因此尾随点将是一个错误),您可以注册一个自定义函数来判断当前索引是否是最后一个:
lister := template.Must(template.New("foo").Funcs(template.FuncMap{
"IsLast": func(i, size int) bool { return i == size-1 },
}).Parse(tpl))
然后使用以下模板:
tpl := "{{range $i, $el := .items}}{{$el}}{{if IsLast $i (len $.items)}}.{{else}},{{end}}{{end}}"
那么输出将是(在Go Playground上试试):
1,4,2.
这个的一个变体可以是注册一个自定义函数,它根据长度(lastIdx = length - 1
)计算最后一个索引,然后在 {{range}}
中你可以做一个简单的比较:
tpl := "{{$lastIdx := LastIdx (len .items)}}{{range $i, $el := .items}}{{$el}}{{if eq $lastIdx $i}}.{{else}},{{end}}{{end}}"
lister := template.Must(template.New("foo").Funcs(template.FuncMap{
"LastIdx": func(size int) int { return size - 1 },
}).Parse(tpl))
输出将相同。在 Go Playground.
上试用