您不能仅使用模板操作来做到这一点,但您可以注册一个提供必要帮助的函数。
您可以注册一个返回函数(闭包)的函数,该函数在调用时交替其返回值(“奇数”和“偶数”索引如何交替):
func isEven() func() bool {
e := false
return func() bool {
e = !e
return e
}
}
我将其命名为 isEven(),以免与 ravel 的 even() 发生冲突。使用它:
func main() {
t := template.Must(template.New("").Funcs(template.FuncMap{
"isEven": isEven,
}).Parse(templ))
m := map[string]string{
"a": "A", "b": "B", "c": "C", "d": "D",
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const templ = `{{$e := isEven}}
{{- range $k, $v := . -}}
[even:{{call $e}}] key={{$k}}; value={{$v}}
{{end}}`
输出(在Go Playground 上试试):
[even:true] key=a; value=A
[even:false] key=b; value=B
[even:true] key=c; value=C
[even:false] key=d; value=D
如果您想要奇数和偶数迭代的不同输出,您可以在 {{if}} 操作中调用 $e,如下所示:
const templ = `{{$e := isEven}}
{{- range $k, $v := . -}}
[{{if call $e}}even{{else}}odd {{end}}] key={{$k}}; value={{$v}}
{{end}}`
这个的输出(在Go Playground上试试):
[even] key=a; value=A
[odd ] key=b; value=B
[even] key=c; value=C
[odd ] key=d; value=D
引擎盖下
此模板操作:
{{$e := isEven}}
创建一个名为$e 的新模板变量,其值将是isEven() 函数调用的结果(返回值)。 isEven() 返回一个函数值,一个可以访问 bool 类型的局部变量 e 的闭包。稍后您执行{{call $e}} 时,您不是在调用isEven() Go 函数,而是它返回的函数(闭包)并存储在$e 中。该闭包引用了本地bool 变量e,直到isEvent() 返回的函数可访问,它才会“释放”。
因此,每当您执行{{call $e}} 时,它都会调用闭包,该闭包“具有”e 类型为bool 的变量,其值在此$e 的调用之间保留。
如果您再次在模板中调用isEvent,那将返回一个新函数(闭包),包装局部变量e 的新实例,独立于由第一个isEvent() 电话。