我正在寻找使用Go模板循环数组,并且我想在循环中的最后一项添加一个额外的字符串。
在python中,我可以做到
{% for host in hosts %}
{{ host }}{% if loop.last %} ;{% endif %}
{% endfor %}
想要通过Go实现同样的目标,下面是Go等效的片段。
{{ range $host := $hosts }}
{{$host}}
{{ end }}
感谢。
答案 0 :(得分:3)
如果列表不为空,则Python代码段会在最后一项之后打印分号。您可以通过围绕范围来获得与Go相同的结果,并使用if来检查切片中是否至少有一个元素并打印;在循环之外。
{{if $hosts}}{{range $host := $hosts}}
{{$host}}
{{ end }} ;{{end}}
此代码段有效,因为您要添加到最后一项的末尾。更通用的解决方案需要自定义模板功能。这是一个示例函数:
func last(v interface{}, i int) (bool, error) {
rv := reflect.ValueOf(v)
if rv.Kind() != reflect.Slice {
return false, errors.New("not a slice")
}
return rv.Len()-1 == i, nil
}
以及如何在模板中使用它:
{{range $i, $host := $hosts }}
{{$host}}{{if last $hosts $i}} ;{{end}}
{{ end }}
答案 1 :(得分:0)
另一种方法是定义一个减量函数,例如
"dec": func(n int) int { return n - 1 },
然后您可以使用dec
函数来计算最后一个元素,例如
{{$last := dec (len $hosts)}}
{{range $i, $host := $hosts}}
{{$host}}{{if eq $i $last}} ;{{end}}
{{end}}
当然,如果Go模板允许减法会更容易,那么您可以编写{{$last := (len $hosts) - 1}}
。毕竟,他们坚持要在空格减号之前或之后有一个空格,那么为什么不允许简单的算术运算呢?