python - 去替代 python loop.last

标签 python go go-templates

我希望使用 Go 模板遍历一个数组,我想向循环中的最后一项添加一个额外的字符串。

在python中,我可以做到

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

希望用 Go 实现同样的事情,下面是 Go 等价物的片段。

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

谢谢。

最佳答案

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

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

我发布了一个 a working example of the custom function去 Playground 。

关于python - 去替代 python loop.last,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207131/

相关文章:

Python获取特定元素的元素值

Go 等效于 C 的否定扫描集

javascript - 在 Javascript 中引用 Go 数组

templates - 使用多个管道参数调用模板

Python 2.7 Openpyxl 用户警告

python - Django 模型表单 - 无效且没有任何错误

vim - "autocmd FileType go compiler go"应该做什么?

go - 重新定义 Go 模板 : sometimes works, 有时会失败

Python 日期时间 : use strftime() with a timezone-aware date

google-app-engine - Golang GAE 将图像 Url 保存到 Blobstore