检测模板范围中的最后一个元素
在 Golang 文本模板中,range 指令迭代集合中的元素并提供对当前元素及其索引。虽然这种机制有助于高效循环,但在识别序列中的最后一个元素时却提出了挑战。
问题:
考虑一个模板:
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
默认情况下,此模板将输出以逗号分隔的元素列表:
one, two, three
但是,要生成最终元素前面带有“and”的人类可读输出,我们需要确定range 的最后一个索引。
解决方案:
虽然模板中不直接支持算术运算,但解决方法涉及使用 Go 的反射包:
package main import ( "os" "reflect" "text/template" ) var fns = template.FuncMap{ "last": func(x int, a interface{}) bool { return x == reflect.ValueOf(a).Len() - 1 }, } func main() { t := template.Must(template.New("abc").Funcs(fns).Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if last $i $}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
此解决方案在模板的函数映射的最后引入了 Go 函数。该函数以当前索引和集合作为参数,如果索引等于集合长度减一,则返回 true。
通过将此函数合并到模板中,我们可以区分最后一个元素并输出所需的内容结果:
one, two, and three
附加说明:
另一种方法使用 len 函数来计算模板中集合的长度,而不需要反射:
{{range $i, $e := .}}{{if $i}}, {{end}}{{if eq $i (len $)}}and {{end}}{{$e}}{{end}}.`
以上是如何检测 Golang 模板范围中的最后一个元素?的详细内容。更多信息请关注PHP中文网其他相关文章!