Golang模板范围中的最后一项

时间:2014-03-13 01:26:54

标签: go go-templates

给出模板

{{range $i, $e := .SomeField}}
        {{if $i}}, {{end}}
        $e.TheString
{{end}}

这可以输出

one, two, three

但是,如果我要输出

one, two, and three

我需要知道上面范围内的最后一个元素。

我可以设置一个包含数组.SomeField长度的变量,但总是3,而上面的$ i值只能达到2.而且你不能在模板中执行算术运算我所见过的。

是否可以检测模板范围中的最后一个值?欢呼声。

2 个答案:

答案 0 :(得分:14)

这可能不是最优雅的解决方案,但它是我能找到的最好的解决方案:

http://play.golang.org/p/MT91mLqk1s

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

注意:您也可以在不反映使用len功能的情况下执行此操作(贷记给Russ Cox): http://play.golang.org/p/V94BPN0uKD

c.f。

答案 1 :(得分:0)

我们今天在docker inspect命令中使用format时遇到了同样的问题。 在不修补Docker的情况下获取最后一个元素的最简单方法是(为了便于阅读,该表达式已分成几行):

{{ $image := "" }}
{{ range split .ContainerImageName "/" }}
    {{ $image = . }}{{ end }}
{{ index (split $image ":") 0 }}

因此,在我们的情况下,我们需要不带注册表地址和版本的映像名称。 例如,像 registry.domain.local / images / nginx:latest 这样的图像名称将变成 nginx

P.S:您需要执行> = 1.11才能完成工作(https://github.com/golang/go/issues/10608