给出模板
{{range $i, $e := .SomeField}}
{{if $i}}, {{end}}
$e.TheString
{{end}}
这可以输出
one, two, three
但是,如果我要输出
one, two, and three
我需要知道上面范围内的最后一个元素。
我可以设置一个包含数组.SomeField长度的变量,但总是3,而上面的$ i值只能达到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)