替代python loop.last

oBa*_*oBa 8 python go go-templates

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

在python中,我可以做到

{% for host in hosts %}
{{ host }}{% if loop.last %} ;{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

为了与Go实现相同的目标,下面是Go等效的片段.

{{ range $host := $hosts }}
{{$host}}
{{ end }}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Cer*_*món 3

如果列表不为空,则 Python 代码片段会在最后一项后面打印一个分号。在 Go 中,您可以通过用 if 包围范围来检查切片中是否至少有一个元素并打印 ; 来实现相同的结果。在循环之外。

{{if $hosts}}{{range $host := $hosts}}
{{$host}}
{{ end }} ;{{end}}
Run Code Online (Sandbox Code Playgroud)

该代码片段之所以有效,是因为您要添加到最后一项的末尾。更通用的解决方案需要自定义模板函数。这是一个示例函数:

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
}
Run Code Online (Sandbox Code Playgroud)

以下是如何在模板中使用它:

{{range $i, $host := $hosts }}
{{$host}}{{if last $hosts $i}} ;{{end}}
{{ end }}
Run Code Online (Sandbox Code Playgroud)

我将自定义函数的工作示例发布到了 Playground。