8

我正在寻找使用 Go 模板循环遍历一个数组,并且我想在循环中的最后一项中添加一个额外的字符串。

在python中,我可以做到

{% for host in hosts %}
{{ host }}{% if loop.last %} ;{% endif %}
{% endfor %}

为了用 Go 实现同样的目标,下面是 Go 等价物的片段。

{{ range $host := $hosts }}
{{$host}}
{{ end }}

谢谢。

4

2 回答 2

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

我在操场上发布了一个自定义函数的工作示例。

于 2014-11-29T21:21:45.150 回答
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}}. 毕竟,他们坚持在空格减号之前或之后有一个空格,那么为什么不允许简单的算术呢?

于 2019-08-21T02:04:34.660 回答