给定模板:
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
这可以输出:
one, two, three
但是,如果我要输出:
one, two, and three
我需要知道哪个是上述范围内的最后一个元素。
我可以设置一个变量,该变量保留数组的长度.SomeField,但是始终为3,并且$i上面的值永远只能为2。而且,根据我所见,您无法在模板中执行算术运算。
.SomeField
$i
是否可以检测模板范围内的最后一个值?干杯。
这可能不是最优雅的解决方案,但却是我能找到的最好的解决方案:
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
len
cf